2015-09-16 144 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> 
相關問題