2014-02-07 50 views
0

我有一个XML数据的属性在XML复杂元素如下所示遍历基于使用XSLT

输入XML

   <?xml version = "1.0" encoding = "UTF-8"?> 
       <Root> 
        <Child ID = "1"> 
         <condition>true</condition> 
         <code>Error-1</code> 
        </Child> 
        <Child ID = "2"> 
         <condition>false</condition> 
         <code>Error-2</code> 
        </Child> 
        <Child ID = "3"> 
         <condition>true</condition> 
         <code>Error-3</code> 
        </Child> 
        <Child ID = "4"> 
         <condition>false</condition> 
         <code>Error-4</code> 
        </Child> 
        <Child ID = "5"> 
         <condition>true</condition> 
         <code>Error-5</code> 
        </Child> 
        <Child ID = "6"> 
         <condition>true</conditions> 
         <code>Error-6</code> 
        </Child> 
        <Child ID = "7"> 
         <condition>false</condition> 
         <code>Error-7</code> 
        </Child> 
       </Root> 

我的要求是下遍历条件元件的所有子节点。

如果条件元素的值然后我在代码元素来获取相关值

预期输出:

<?xml version = "1.0" encoding = "UTF-8"?> 
    <code>Error-1</code> 
    <code>Error-3</code> 
    <code>Error-5</code> 
    <code>Error-6</code> 

我一直在努力做到这一点基于子节点的属性ID。在条件元素上迭代时如何获取其父节点(即,子元素)的属性ID,并在条件元素的值为true时保留它以获取相关代码。

回答

1

您需要以下样式:

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

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Child"> 
     <xsl:if test="condition[.='true']"> 
      <xsl:apply-templates select="code"/> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
0

不知道您正在使用的XSLT的上下文我可以说,您可以使用正确的XPath轻松完成此操作。

Root/Child[condition='true']/code 

只要您使用正确的谓词,就可以根据需要调整上下文。

+0

我将动态评估的条件,从而将过滤器是不可行的。我必须迭代节点并根据条件评估获取代码。让我们只是说,Condition元素保存值“A = A”。我将使用Evaluate()函数对此进行评估。如果评估成功,我必须获取相关代码。我们如何在XSLT中实现这一点? – Guru

+0

@Guru你可以用你试图使用的XSLT更新你的问题吗?什么评估功能?此外,你的问题没有提到任何有关“A = A”的情况。这个XPath可以工作,并且可以根据您需要执行的操作以多种不同方式进行修改。 –