我需要根据属性值及其在 xml 文档中的位置,将 xml 节点添加到输出文档中的特定位置。
在下面的示例中,每次出现 product="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+count(前兄弟::item[@product='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
如何根据产品节点“111”和“222”的位置获得返回b、g和i的路径?在我的 select 语句的路径中,previous-sibling 变量没有像我期望的那样工作。
请帮忙!