gpt4 book ai didi

xslt - 如何使用XSLT根据其依赖关系对某些XML元素进行排序?

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

我想对以下XML文件进行排序:

<root>
<element name="a" depends="b,c" />
<element name="b" depends="c" />
<element name="c" />
</root>

结果如下:
<root>
<element name="c" />
<element name="b" depends="c" />
<element name="a" depends="b,c" />
</root>

我的依赖关系可以通过使用树(无循环)来建模。
depend =“b,c”表示同时依赖b和c。
我在问通过使用XSLT做到这一点的好方法。也许,您有什么想法吗?
谢谢!

最佳答案

此XSLT 2.0转换:

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

<xsl:template match="/*">
<root>
<xsl:call-template name="directDependents"/>
</root>
</xsl:template>

<xsl:template name="directDependents">
<xsl:param name="pCore" as="element()*"/>

<xsl:variable name="vNewDependents" select=
"/*/element
[not(. intersect $pCore)
and
not(tokenize(@depends, ',')[not(. = $pCore/@name)])
]
"/>

<xsl:if test="$vNewDependents">
<xsl:sequence select="$vNewDependents"/>
<xsl:call-template name="directDependents">
<xsl:with-param name="pCore" select="$pCore | $vNewDependents"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

应用于第二个提供的XML文档时的 :
<root>
<element name="a" depends="b" />
<element name="b" depends="c" />
<element name="c" />
</root>

产生所需的正确结果:
<root>
<element name="c"/>
<element name="b" depends="c"/>
<element name="a" depends="b"/>
</root>

更新:这是一个更具“XSLT 2.0外观”的解决方案(未经测试-当我回到家时将纠正所有错误):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*">
<root>
<xsl:sequence select="my:directDependents(/..)"/>
</root>
</xsl:template>

<xsl:function name="my:directDependents">
<xsl:param name="pCore" as="element()*"/>

<xsl:sequence select=
"for $vNewDependents in
/*/element
[not(. intersect $pCore)
and
not(tokenize(@depends, ',')[not(. = $pCore/@name)])
]
return
if($vNewDependents)
then
(
$vNewDependents,
my:directDependents($pCore | $vNewDependents)
)
else ()
"/>
</xsl:function>
</xsl:stylesheet>

关于xslt - 如何使用XSLT根据其依赖关系对某些XML元素进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553288/

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