2015-09-16 77 views
0

我试着让XSLT另一个元素值获得父元素

我想要做这样的事情得到其中的SequenceNumber = 2

我试图TransactionDetail元素基于子元素值的父节点那样做,但即时通讯失去了一些东西......

ancestor:://*[local-name()='SequenceNumber'][text()=2] 

//TransactionDetail[//SequenceNumber = 2] 

这是XML

<Root> 
<biztalk_1> 

    <body> 
     <ActiveStore_SalesTransaction_1.70> 

      <TransactionDetail> 
       <SequenceNumber>2</SequenceNumber> 

       <TransactionDetailGroup> 
        <Item> 
         <ItemID>22</ItemID> 

         <NonMerchandiseFlag>1</NonMerchandiseFlag> 
        </Item> 
       </TransactionDetailGroup> 
      </TransactionDetail> 




     </ActiveStore_SalesTransaction_1.70> 
    </body> 
</biztalk_1> 

回答

1

使用name()是不是一个好的做法。相反,如下面的XPath使用元素名称:

//TransactionDetail[SequenceNumber = 2] 

中的XPath选择所有TransactionDetail元素与儿童SequenceNumber与整个文档中值2

如果你想TransactionDetail与任何后代SequenceNumber与价值2,使用:

//TransactionDetail[.//SequenceNumber = 2] 

这里,.//SequenceNumber确保只有当前TransactionDetail的后代SequenceNumber元素进行检查。

+0

为什么使用name()不是一个好习惯 – MIkCode

+1

@MIkCode可能有很多原因。我在这里指着一些。 1.处理速度更快(取决于处理器)。一些处理器可能首先列出所有的后代(因为'*'),然后基于'name()'进行过滤。 2. Xpath很容易在没有'name()'的情况下编写。而且,除非你想转义命名空间,否则没有必要在这样的xpath中使用'name()'。 –

1

试试这个:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="Root"> 
    <Root> 
     <xsl:copy-of select="descendant::*[name()='TransactionDetail'] 
                 [descendant::*[name()='SequenceNumber']='2']"/> 
    </Root> 
</xsl:template> 

</xsl:stylesheet> 
相关问题