Xml xslt-从子级推断结果
给定以下xml输入:Xml xslt-从子级推断结果,xml,xslt,Xml,Xslt,给定以下xml输入: <Sections> <Section number="1"> <Step number="1"> <SubStep number="1" Pass="True"> <SubSubStep number="1" Pass="True"/> <SubSubStep number="2" Pass="Tru
<Sections>
<Section number="1">
<Step number="1">
<SubStep number="1" Pass="True">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="True"/>
</SubStep>
</Step>
<Step number="2">
<SubStep number="1" Pass="False">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="False"/>
</SubStep>
</Step>
</Section>
</Sections>
如何将其转换为:
<Sections Pass="False">
<Section number="1" Pass="False">
<Step number="1" Pass="True">
<SubStep number="1" Pass="True">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="True"/>
</SubStep>
</Step>
<Step number="2" Pass="False">
<SubStep number="1" Pass="False">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="False"/>
</SubStep>
</Step>
</Section>
</Sections>
我想从孩子们那里推断出父母的结果。如果任何子级的结果为Pass=“False”,则父级结果将为Pass=“False”。向后递归?您可以使用“
//node()[@Pass='True']
”XPath表达式查看当前节点的任何子节点是否为“True”。您可以按如下方式执行:
Pass
属性的元素节点,添加它。如果子级中至少有一个值为False
的Pass
属性,则将其设置为False
,否则设置为True
假的
真的
XSLT不太擅长转换空白,它在XML上工作得更好。:)不需要转换。:)我认为您需要编辑此文件以包含您的XML和所需的输出。哈哈。。。在努力添加代码块之后,我终于让步了,决定阅读指南:)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- set missing Pass attribute -->
<xsl:template match="*[not(@Pass)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="Pass">
<xsl:choose>
<xsl:when test=".//*[@Pass = 'False']">False</xsl:when>
<xsl:otherwise>True</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>