基于元素级别的过程和返回输出



我正在尝试转换输出作为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>&#xA;</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>&#xA;</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进行实例化时,当前的节点列表列表列表包括以分类顺序处理的完整节点列表"。

相关内容

  • 没有找到相关文章

最新更新