문제

나는 XSLT 변수를 사용하려고 노력하고 있으며 성공하지 못한다.

다음 코드 스 니펫이 있습니다.

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xalan="http://xml.apache.org/xslt"
  version="1.0">

    <xsl:template match="/">
      <xsl:variable name="config" select="query/@config"></xsl:variable>

따라서 최상위 요소 '쿼리'의 'config'속성 값으로 변수 'config'가 설정 될 것으로 기대합니다.

그런 다음 스타일 시트에서 나중에 변수를 사용하려고합니다.

<a href="localhost/test?go">
    {$config}
</a>

그러나 내 출력 HTML 문서에서 볼 수있는 출력은 다음과 같습니다.

<a href="localhost/test?go">
    {$config}
</a>

따라서 예상대로 가치가 대체되지 않았습니다.

나는 이것이 가장 간단한 경우라고 생각합니다. 그래서 나는 멍청한 바보입니다! 도와주세요, 감사합니다!


응답 한 모든 분들께 감사드립니다. 나는 속성에서 일하는지 또는 외부에서 일하고 있는지에 대한 다른 맥락을 오해했습니다. 내 문제를 멋지게 정리했습니다!

내가 가지고있는 두 가지 답변과 @Aaron Digulla의 두 가지 답변을 받아 들일 수 있다면 속성을 설명했습니다.

도움이 되었습니까?

해결책

스타일 시트에서 사용해야합니다.

<xsl:value-of select="$config"/>

대신에:

{$config}

다른 팁

여기에는 동일하게 보이지만 미묘하게 다른 두 가지 질문이 있습니다. 1) 어떻게 변수를 이름으로 참조합니까? 2) 어디에 변수를 이름으로 참조 할 수 있습니까?

첫째, 변수는 항상 그것을 사용하여 참조됩니다 $varname 통사론. 둘째,이 작업을 수행 할 수 있습니다 표현이 허용됩니다. 혼란스러워 보이는 것은 두 번째 부분입니다. 우선 요소 또는 속성의 값은 기본적으로 문자 그대로 출력되므로 다음 예에서는 변수가 실제로 참조되지 않습니다.

<element attr="$test">$test or {$test}</element>

출력은 문자 그대로 입력 한 내용과 일치합니다.

변수의 값을 출력하려면 표현식이 허용되는 곳에 참조해야합니다. 요소 내용에서 우리는 사용합니다 xsl:value-of; 로 취급되는 속성에서 속성 값 템플릿 (예 : 문자 그대로의 결과 요소의 속성), 표현은 곱슬 괄호로 구분됩니다. {}. 다음 선언을 가정하십시오.

<xsl:variable name="test" select="'value'"/>

... 그런 다음 다음 :

<element attr="{$test}"><xsl:value-of select="$test"/></element>

... 결과 :

<element attr="value">value</element>

AVTS에 대한 몇 가지 이별 노트 value-of:

  • 두 경우 모두 변수는 다음과 같이 참조되었습니다 $test. AVT의 브레이스는 변수 참조의 일부가 아닙니다. 그들은 표현 구분 자입니다.
  • 두 경우 모두 표현식은 변수에 대한 참조를 포함하지 않았을 필요가 없으며; XPath 표현이 허용되었을 것입니다.
  • XSLT 문서의 모든 속성이 속성 값 템플릿으로 취급되는 것은 아닙니다. 예를 들어,주의하십시오 xsl:value'에스 select 기인하다 이미 표현을 받아들입니다 내용으로.
  • 의문: 왜 당신은 사용할 수 없습니다 value-of 이런 속성에서?

    <element attr="<xsl:value-of select="$test"/>"/>
    

    대답: XSLT 문서에는 잘 형성된 XML이 포함되어야하기 때문입니다.

  • 의문: 왜 당신은 사용할 수 없습니다 {$varname} 요소 내용에서?

    glib 답변: XSLT의 제작자는 그렇게 디자인하지 않았기 때문입니다.

{$config} XSLT 요소의 속성에서만 작동합니다. (참고 : 완전한 xpath 표현식은 교정기로 둘러싸여 있어야하기 때문에 버팀대 내부 달러)

사용 <xsl:value-of select="$config"/> 대신에 {$config}.

@lwburk의 답변은 훌륭하지만 (+1), 마지막 질문/답변은 XSLT 1.0 및 2.0에 대해서만 정확합니다. 3.0에서 TVT를 사용할 수 있습니다 (텍스트 값 템플릿; @lwburk의 답변에 언급 된 AVT (속성 값 템플릿)와 유사합니다).

TVT를 사용하려면 표준 속성을 추가하십시오 xsl:expand-text="yes" 요소에. 이로 인해 프로세서가 해당 요소의 자손 텍스트 노드를 TVT로 처리하게됩니다.

예시:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

산출 (잘 형성된 XML 사용으로 입력)

<result>This is Dan's result: BAM!</result>

참고 : 색소폰 -PE 9.5를 사용하여 테스트했습니다.

사용해야하기 때문에 <xsl:value-of select="config"/> ?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top