2014-12-19 3 views
3

내가 XML 파일이 :XSLT XML 노드가 있는지 확인하는 방법은 무엇입니까?

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
<Data> 
    <Records> 
    <Record> 
    <AddInfo> 
     <Info> 
     </Info> 
    </AddInfo> 
    </Record> 
    </Records> 
</Data> 

및 XSL 파일 :

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="Dane"> 
    <html> 
     <link rel="stylesheet" type="text/css" href="report.css"></link> 
     <body> 
     <h2>Table1</h2> 
     <table border="1" cellspacing="0"> 
      <tr> 
      <th>XXX</th> 
      </tr> 
      <xsl:for-each select="Records/Record"> 
      <tr> 
       <td> 
       <xsl:value-of select="XXX"/> 
       </td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     <h2>SecondTable</h2> 
     <table border="1" cellspacing="0"> 
      <tr> 
      <th>YYY</th> 
      <th>ZZZ</th> 
      </tr> 
      <xsl:for-each select="Records/Record/AddInfo/Info"> 
      <tr> 
       <td> 
       <xsl:value-of select="YYY"/> 
       </td> 
       <td> 
       <xsl:value-of select="ZZZ"/> 
       </td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

그리고 나는이처럼 만들고 싶어 : 노드가 "정보"노드, 디스플레이 테이블을 존재하지 않을 경우 경우, 몇 가지 텍스트를 표시하십시오.

나는

<xsl:if test="following-sibling::AddInfo"> 
</xsl:if> 

<xsl:if test="AddInfo"> 
</xsl:if> 

을하려고했는데 그러나 그것은 작동하지 않습니다.

내가 이런 식으로 원하는 :

Table1 
--------------------- 
|  |  |  | 

(조건 : 내부 XML 노드가 될 경우, 나는 두 번째 테이블을 표시하려면, 표에서)

SecondTable 
------------- 
|  |  | 

내가 이것을 어떻게 할 수 있습니까?

+1

작동 확인하려면 무엇을 묻고있어. 한 가지 중요한 점은 예상 출력을 게시하지 않은 것입니다. 그리고 처리 할 입력 XML에 모든 시나리오를 넣으십시오. –

+1

질문이 명확하지 않습니다. 이 테스트를 정확히 어디에 삽입 하시겠습니까? 하나의 일반 테이블 만 있으므로 "* 노드가 있으면"정보 "노드가있는 테이블을 표시하고, 그렇지 않으면 SOME TEXT *를 표시하면"거의 이해가되지 않습니다. –

+0

그래서 addInfo 요소가 없으면 일부 텍스트가 표시되어야한다고 말하고 있습니까? – Rnet

답변

11

이 그렇지 않으면 <AddInfo><Record>의 즉각적인 아이를 존재 Yep 경우 출력하고 Nope : 당신이 for-each 필요하지 않습니다

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Data"> 
    <xsl:for-each select="Records/Record"> 
     <xsl:choose> 
     <xsl:when test="AddInfo">Yep</xsl:when> 
     <xsl:otherwise>Nope</xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

주, 당신은 할 수 있어야 두 번째 템플릿 일치하는 각 <Record> :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Data"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="Data/Records/Record"> 
    <xsl:choose> 
     <xsl:when test="AddInfo">Yep</xsl:when> 
     <xsl:otherwise>Nope</xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

choose을 피하고 두 개의 독립적 인 if 조건을 사용할 수도 있습니다.

<xsl:template match="Data/Records/Record"> 
    <xsl:if test="AddInfo">Yep</xsl:if> 
    <xsl:if test="not(AddInfo)">Nope</xsl:if> 
    </xsl:template> 

직접적인 어린이로 제한하고 싶지 않은 경우 .//AddInfo을 대신 사용하십시오. <Record>에는 <AddInfo> 노드가 존재하지 않는 경우는

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Data"> 
    <xsl:apply-templates select="Records/Record"/> 
    </xsl:template> 

    <xsl:template match="Data/Records/Record"> 
    <table class="one"></table> 
    <xsl:if test="AddInfo"> 
     <table class="two"></table> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

그것은

<table class="one"></table> 

을 출력하고, 그렇지 않으면

<table class="one"></table> 
<table class="two"></table> 

:

는 다음과 같은 스타일 시트를 고려하십시오.

ifchoose도 사용하지 않고 해결할 수 있습니다.XML :

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
<Data> 
    <AddInfo> 
    <Info>This is ignored</Info> 
    </AddInfo> 
    <Records> 
    <Record> 
     <AddInfo> 
      <Info>One,</Info> 
      <Info>Two,</Info> 
      <Info>Three</Info> 
     </AddInfo> 
    </Record> 
    <Record> 
     <Info>Ignored as well</Info> 
    </Record> 
    <Record> 
     <Nested> 
     <AddInfo> 
      <Info>So is this</Info> 
     </AddInfo> 
     </Nested> 
    </Record> 
    </Records> 
</Data> 

XSLT :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Data"> 
    <root> 
     <xsl:apply-templates select="Records/Record"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="Data/Records/Record"> 
    <xsl:copy> 
     <table id="one"></table> 
     <xsl:apply-templates select="AddInfo"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Data/Records/Record/AddInfo"> 
    <table id="two"> 
     <xsl:apply-templates select="Info"/> 
    </table> 
    </xsl:template> 

    <xsl:template match="Data/Records/Record/AddInfo/Info"> 
    <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

출력 : 노드가 XML에 존재하는 경우

<root> 
    <Record> 
    <table id="one" /> 
    <table id="two">One,Two,Three</table> 
    </Record> 
    <Record> 
    <table id="one" /> 
    </Record> 
    <Record> 
    <table id="one" /> 
    </Record> 
</root> 
+0

이 테스트를 거친 것 같습니다. 생성 된 XML 내에 "AddInfo"노드가 없으면 SecondTable (YYY, ZZZ)의 헤더가 계속 표시되기 때문에이 헤더 대신 일부 텍스트를 표시하려고합니다. – vBB

+0

조건 노드는 물론 두 번째 테이블을 생성하는 모든 노드를 래핑해야합니다. 내 업데이트 답변을 참조하십시오. – CoDEmanX

+0

감사합니다! 이제 작동 중입니다 :) – vBB

0

이 XSLT 코드 그것은 분명하지 않다

<xsl:choose> 
       <xsl:when test="XMLNodeName"> 
        <Cell ss:Index="2" ss:StyleID="s110"> 
        <Data ss:Type="String"> 
         <xsl:value-of select="NodeOne"/> 
        </Data> 
        </Cell> 
       </xsl:when> 
       <xsl:otherwise> 
        <Cell`enter code here` ss:Index="2" ss:StyleID="s110"> 
        <Data ss:Type="String"> 
         <xsl:value-of select="NodeTwo"/> 
        </Data> 
        </Cell> 
       </xsl:otherwise> 
</xsl:choose> 
관련 문제