2012-07-09 84 views
0

我需要根據屬性值及其在xml文檔中的位置,將xml節點添加到我的輸出文檔中的特定位置。xslt根據屬性值獲取第n個同級

在下面的示例中,每次出現產品=「111」時,我都需要獲取product =「222」子項的相應路徑屬性。需要注意的是:他們在文檔中的相對位置必須匹配。對於第一個產品=「111」,我將需要第一個產品的路徑=「222」。對於第二個「111」,我將需要第二個產品「222」的路徑。

輸出,我需要(我還加了當前產品的路徑還可以,但沒有問題與):

<output> 
    <product_out id="111"> 
     <path>b</path> 
    </product_out> 
    <product_out id="111"> 
     <path>g</path> 
    </product_out> 
    <product_out id="111"> 
     <path>i</path> 
    </product_out> 
</output> 

我的XML文檔。

<?xml version="1.0"?> 
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<item product="111"> 
    <sub_item path="a" /> 
</item> 
<item product="222"> 
    <sub_item path="b" /> 
</item> 
<item product="333"> 
    <sub_item path="c" /> 
</item> 
<item product="111"> 
    <sub_item path="d" /> 
</item> 
<item product="111"> 
    <sub_item path="e" /> 
</item> 
<item product="555"> 
    <sub_item path="f" /> 
</item> 
<item product="222"> 
    <sub_item path="g" /> 
</item> 
<item product="555"> 
    <sub_item path="h" /> 
</item> 
<item product="222"> 
    <sub_item path="i" /> 
</item> 
</order> 

我的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="/"> 
<output> 
    <xsl:apply-templates /> 
</output> 
</xsl:template> 

<xsl:template match="order/item"> 
<product_out> 
    <xsl:attribute name="id"><xsl:value-of select="@product"/></xsl:attribute> 

    <xsl:if test="@product = 111"> 
     <the_correct_sibling_position><xsl:value-of select="1+count(preceding-sibling::item[@product='111'])"/></the_correct_sibling_position> 
     <path_test1><xsl:value-of select="/order/item[position()=4]/sub_item/@path"/></path_test1> 
     <path_test2><xsl:value-of select="/order/item[2]/sub_item/@path"/></path_test2> 
     <path_test3><xsl:value-of select="/order/item[position()=number(1+count(preceding-sibling::item[@product='111']))]/sub_item/@path"/></path_test3> 
     <path_test4><xsl:value-of select="/order/item[position()=1+count(preceding-sibling::item[@product='111'])]/sub_item/@path"/></path_test4> 
    </xsl:if> 
    <path><xsl:value-of select="sub_item/@path[1]"/></path> 
</product_out> 
</xsl:template> 
</xsl:stylesheet> 

我能得到我需要使用

1 +計數(前同輩正確的數組位置::項[@產物= '111'])

我已經測試了輸出確定節點內的值爲<the_correct_sibling_position>節點。

我還可以硬編碼的節點位置:

path_test1 always returns d 
path_test2 always returns b 

下2個測試不輸出值B,G,我喜歡我期望的那樣。

path_test3 always returns a 
path_test4 always returns a 

如何獲取路徑返回B,G,和我根據產品的節點「111」「222」的位置?前面的兄弟變量沒有像我期望的那樣在我的select語句的路徑中工作。

請幫忙!

+0

我會回答我的問題時,堆棧溢出允許我(我必須等待6個小時)。我重新測試了一些我以前的嘗試,現在它正在工作,不知道爲什麼它沒有。我添加了一個變量,然後在我的select語句中使用它。 可變代碼: 我的選擇聲明: user1513023 2012-07-09 23:00:56

回答

1

我重新測試了一些我以前的嘗試,它現在正在工作,不知道爲什麼它沒有之前。我添加了一個變量,然後在我的select語句中使用它。

變量代碼:

<xsl:variable name="t1"><xsl:value-of select="1+count(preceding-sibling::item[@product='111'])"/></xsl:variable> 

我的select語句:

 <path_test_good><xsl:value-of select="/order/item[@product='222'][position()= $t1]/sub_item/@path"/></path_test_good>