내 XSLT 변수가 값을 대체하지 않는 이유는 무엇입니까?
-
10-07-2019 - |
문제
나는 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"/>
?