2013-04-16 2 views
1

XML 문서를 변환하려고 시도하고 있습니다. 첫째, 글로벌 변수를 정의하고있다 :XSLT 변수를 정의하고 변수가 존재하는지 확인하십시오.

<xsl:variable name="foo"><xsl:value-of select="bar"/></xsl:variable> 

가 지금은 변화하고있어 XML이 <bar>some data</bar>에 정의되어있는 기회가있다. 또한 정의되지 않은 기회가 있습니다.

나는 아래의 전역 변수 선언되면

, 나는이 정의되어있는 경우 출력에 다음을 시도하고있다 :

<foo>DEFINED</foo> 

을하고 그것을 정의되어 있지 않은 경우 :

<foo>NOT DEFINED</foo> 

나는 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

를 사용하고

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이 있지만 작동하는지 잘 모르겠어요

+0

변수'foo'가 변수 정의 뒤에 정의 :하지만 '테스트 = "이름 ($ foo는)"를 선호 . Or test="name($foo) = 'bar' 어떤로 이어집니다. 유일한 질문은 텍스트 노드가 포함되어 있는지 여부입니다. –

+0

텍스트 노드가 정의되었는지 여부를 확인하는 방법에 대한 질문을하면 더 낫습니까? – randombits

+0

입력에 ''또는 ''이 포함되면 어떻게 될까요? –

답변

5

XSLT 1.0을 사용하고 있으므로 string()을 사용하여 테스트를 수행 할 수 있습니다. 공백이 너무 <bar> </bar> false를 돌려줍니다 붕괴되는 것을

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:variable name="foo" select="bar"/> 
     <results> 
      <xsl:choose> 
       <xsl:when test="string($foo)"> 
        <foo>DEFINED</foo> 
       </xsl:when> 
       <xsl:otherwise> 
        <foo>NOT DEFINED</foo> 
       </xsl:otherwise> 
      </xsl:choose>   
     </results> 
    </xsl:template> 

</xsl:stylesheet> 

참고 :

여기 예를 들어 스타일 시트입니다. 또한 string()은 변수 대신 직접 요소를 테스트 할 때 작동합니다.여기

일부 입력/출력 예이다 :


입력

<test> 
    <bar/> 
</test> 

또는

<test> 
    <bar></bar> 
</test> 

또는

<test> 
    <bar> </bar> 
</test> 
01,235,

출력

<foo>NOT DEFINED</foo> 

입력

<test> 
    <bar>x</bar> 
</test> 

출력

<foo>DEFINED</foo> 

XSLT 2.0을 사용할 수있는 경우 변수를 xs:string으로 선언하고 테스트에서 변수 이름 (test="$foo") 만 사용할 수 있습니다.

예 :

<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xs"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:variable name="foo" select="bar" as="xs:string"/> 
     <results> 
      <xsl:choose> 
       <xsl:when test="$foo"> 
        <foo>DEFINED</foo> 
       </xsl:when> 
       <xsl:otherwise> 
        <foo>NOT DEFINED</foo> 
       </xsl:otherwise> 
      </xsl:choose>   
     </results> 
    </xsl:template> 

</xsl:stylesheet> 
0

...

는 스타일 시트에 xmlns:fn="http://www.w3.org/2005/xpath-functions"를 추가합니다.

<xsl:choose> 
    <xsl:when test="fn:boolean(foo)"> 
    <foo>DEFINED</foo> 
    </xsl:when> 
    <xsl:otherwise> 
    <foo>NOT DEFINED</foo> 
    </xsl:otherwise> 
</xsl:choose> 

편집 : 그것이 작동하는 경우에 정의 된대로이 <bar/> 또는 <bar></bar>을 처리합니다 @JimGarrison.

+0

'fn' 접두사를 선언 할 필요가 없으며'boolean()'에 추가 할 필요가 없습니다. –

0

변수 푸 (줄의 내용 인 텍스트뿐만 아니라) XML 노드 줄을 포함하여 XML은 줄이 포함되어 있습니다. 따라서 "@indeterminately sequenced"의 답은 foo에 test="boolean($foo)" 인 xml 노드 (bar)가 포함되어 있는지 테스트 할 수 있습니다.

<xsl:variable name ="foo" select="*/bar" /> 

<xsl:template match="/"> 
    <results> 
     <xsl:choose> 
      <xsl:when test="name($foo)"> 
       <foo>DEFINED</foo> 
      </xsl:when> 
      <xsl:otherwise> 
       <foo>NOT DEFINED</foo> 
      </xsl:otherwise> 
     </xsl:choose> 
    </results> 
</xsl:template> 
관련 문제