xslt:测试父节点级别的任何节点是否具有特定值

时间:2017-09-28 10:24:03

标签: xml xslt xpath

我在这里简化了我的xml版本,我想在子节点中使用IMP值填写父节点中的数据(如果有的话),如果子节点中的任何IMP值为true,则该值应为true。如果没有孩子,则应该是假的。

RowKey

所需的输出是

PartitionKey

1 个答案:

答案 0 :(得分:1)

由于输入和输出XML类似,您可以开始使用identity transform

复制输入数据
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>

然后,您可以将没有<parent>的{​​{1}}节点作为其子节点进行匹配,因为这些节点是需要添加子<impvalue>的节点。

<impvalue>

使用条件,您可以检查具有自己子节点的<xsl:template match="parent[not(impvalue)]"> count个节点。

<children>

完整的XSLT如下

<xsl:when test="count(children/*) != 0">

输出

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <!-- identity transform -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>

    <!--  match <parent> having no <impvalue> child -->
    <xsl:template match="parent[not(impvalue)]">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
            <impvalue>
                <xsl:choose>
                    <xsl:when test="count(children/*) != 0">
                        <xsl:value-of select="'true'" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="'false'" />
                    </xsl:otherwise>
                </xsl:choose>
            </impvalue>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>