我正在尝试转换输出作为xml中每个元素的xpath的地方。
这是我的样本xml
<NodeRoot>
<NodeA class="3">
<NodeB xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true">
<NodeC abc="1">103</NodeC>
<NodeD>103</NodeD>
</NodeB>
</NodeA>
<NodeA class="1">
<NodeGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true">
<NodeC name="z" asc="2">103</NodeC>
</NodeGroup>
</NodeA>
</NodeRoot>
我的XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" media-type="text/plain"/>
<xsl:template match="@*|text()|comment()|processing-instruction()"/>
<xsl:template match="@xsi:nil" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<xsl:template match="*">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="concat('/',local-name(.))"/>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
这给了我以下输出
/NodeRoot
/NodeRoot/NodeA
/NodeRoot/NodeA/NodeB
/NodeRoot/NodeA/NodeB/NodeC
/NodeRoot/NodeA/NodeB/NodeD
/NodeRoot/NodeA
/NodeRoot/NodeA/NodeGroup
/NodeRoot/NodeA/NodeGroup/NodeC
返回X Paths,但返回的顺序不是我想要的。目前,该订单是父母的所有孩子。我想要的是,该顺序是根据节点深度获得结果的。因此,应退还第一个根(0级),然后再返回其直接子女(1级元素),其次是2级儿童节点等。
预期结果
/NodeRoot
/NodeRoot/NodeA
/NodeRoot/NodeA
/NodeRoot/NodeA/NodeB
/NodeRoot/NodeA/NodeGroup
/NodeRoot/NodeA/NodeB/NodeC
/NodeRoot/NodeA/NodeB/NodeD
/NodeRoot/NodeA/NodeGroup/NodeC
基本上是
所有级别0元素所有级别的元素。。。所有级别的元素
因此,而不是递归模板过程,所有由祖先计数排序的元素:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="utf-8" media-type="text/plain"/>
<xsl:template match="/">
<xsl:apply-templates select="//*">
<xsl:sort select="count(ancestor::*)"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="concat('/',local-name(.))"/>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:transform>
http://xsltransform.hikmatu.com/jyyivhh
一个简单的<xsl:apply-templates select="//*"/>
将选择文档中的所有元素进行文档顺序处理,但是使用嵌套的<xsl:sort select="count(ancestor::*)"/>
,更改了处理顺序,并且首先处理祖先数量最低的处理顺序。请参阅https://www.w3.org/tr/xslt-10/#section-applying-template-rules,上面写着"所选的节点以文档顺序处理,除非存在分类规范",而https:/https://www.w3.org/tr/xslt-10/#sorting,上面写着:"当模板由xsl:apply-templates进行实例化时,当前的节点列表列表列表包括以分类顺序处理的完整节点列表"。