gpt4 book ai didi

xslt - 使用 XSLT 枚举同名节点

转载 作者:行者123 更新时间:2023-12-04 06:51:16 24 4
gpt4 key购买 nike

我有很多 XML 文件,这些文件通常多次包含节点(每次都有不同的数据)。
例子:

 <?xml version="1.0" encoding="UTF-8"?>  
<SomeName>
<Node>
DataA
</Node>
<Node>
DataB
</Node>
<Node>
DataC
</Node>
<AnotherNode>
DataD
</AnotherNode>
<AnotherNode>
DataE
</AnotherNode>
<AnotherNode>
DataF
</AnotherNode>
<SingleNode>
DataG
</SingleNode>
</SomeName>

所需的输出将是:
  <?xml version="1.0" encoding="UTF-8"?>  
<SomeName>
<Node1>
DataA
</Node1>
<Node2>
DataB
</Node2>
<Node3>
DataC
</Node3>
<AnotherNode1>
DataD
</AnotherNode1>
<AnotherNode2>
DataE
</AnotherNode2>
<AnotherNode3>
DataF
</AnotherNode3>
<SingleNode>
DataG
</SingleNode>
</SomeName>

问题是,我没有所有重复节点名的列表,所以我需要 XSLT 运行所有节点,并且只对多次存在的节点进行编号。那可能吗?

有没有人对如何做到这一点有一个好主意?

谢谢!

最佳答案

这是一个完整的解决方案 . 推荐 使用 Muenchian 方法进行分组而不是基于 count(preceding::*[someCondition]) 的分组,这是非常低效的——O(N^2)。

本次改造 :

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:key name="kElsByName"
match="/*/*" use="name()"/>

<xsl:template match="/*">
<SomeName>
<xsl:for-each select=
"*[generate-id()
=
generate-id(key('kElsByName', name())[1])
]
">

<xsl:variable name="vsameNamedNodes" select=
"key('kElsByName', name())"/>

<xsl:variable name="vNumSameNamedNodes" select=
"count($vsameNamedNodes)"/>

<xsl:for-each select="$vsameNamedNodes">

<xsl:element name="{concat(name(),
substring(position(),
1 div ($vNumSameNamedNodes > 1)
)
)
}">
<xsl:copy-of select="node()"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</SomeName>
</xsl:template>
</xsl:stylesheet>

当应用于提供的 XML 文档时 :
    <SomeName>
<Node>
DataA
</Node>
<Node>
DataB
</Node>
<Node>
DataC
</Node>
<AnotherNode>
DataD
</AnotherNode>
<AnotherNode>
DataE
</AnotherNode>
<AnotherNode>
DataF
</AnotherNode>
<SingleNode>
DataG
</SingleNode>
</SomeName>

产生想要的结果 :
<SomeName>
<Node1>
DataA
</Node1>
<Node2>
DataB
</Node2>
<Node3>
DataC
</Node3>
<AnotherNode1>
DataD
</AnotherNode1>
<AnotherNode2>
DataE
</AnotherNode2>
<AnotherNode3>
DataF
</AnotherNode3>
<SingleNode>
DataG
</SingleNode>
</SomeName>

关于xslt - 使用 XSLT 枚举同名节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3084656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com