XSLT /条件for-each具有相同的父(叔)节点值

时间:2019-06-24 12:31:51

标签: xslt foreach

我需要一些帮助,以了解如何仅选择具有相同父(或叔叔)元素值的某些节点。我的XML看起来像这样

<shipment>
  <goodslines>
    <goodsline>
        <position>1</position>
        <packagenumbers>
            <packagenumber>123</packagenumber>
        </packagenumbers>
    </goodsline>
    <goodsline>
        <position>1</position>
        <packagenumbers>
            <packagenumber>456</packagenumbers>
        </packagenumbers>
    </goodsline>
    <goodsline>
        <position>2</position>
        <packagenumbers>
            <packagenumber>789</packagenumbers>
        </packagenumbers>
    </goodsline>
  </goodslines>
</shipment>

,所需的输出将是:

123,456
789

因此,我需要针对“ packagenumber”-级别进行for-each,以便考虑上级的“ position”-元素

XSL可能是这样的吗?

        <xsl:for-each select="shipment/goodslines/goodsline[some condition here?]/packagenumbers/packagenumber">
            <xsl:value-of select="current()"/>
            <xsl:if test="not(position() = last())">
                <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each>

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

如果您的xml始终具有相同的结构,则可以使用以下结构:

<xsl:template match="goodsline[position = preceding-sibling::goodsline[1]/position]">
    <xsl:text>,</xsl:text>
    <xsl:value-of select="packagenumbers/packagenumber"/>
</xsl:template>

<xsl:template match="goodsline">
    <xsl:text>&#xa;</xsl:text>
    <xsl:value-of select="packagenumbers/packagenumber"/>
</xsl:template>

更具体的模板(带有条件的模板)将始终优先出现并具有更高的优先级。 for-each-group可能还有另一个简单的解决方案。