gpt4 book ai didi

xslt - 在单行 Xpath 1.0 中保留操作数的优先级

转载 作者:行者123 更新时间:2023-12-03 15:52:24 27 4
gpt4 key购买 nike

我真的不能正确地表述它,最好用例子。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar id="someId" class="someClass"/>
<buz class="someClass" id="someId"/>
<ololo class="someClass"/>
<test id="someId"/>
</foo>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*/*">
<xsl:value-of select="@id | @class"/><xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>

结果:

someId
someClass
someClass
someId

我需要什么

我需要属性的“优先级”保持在我的 xpath 表达式中。

所以,如果我们调用 @id | @class 一个有两个操作数的表达式,我需要的属性不是按照文档顺序,而是按照表达式中指定两个操作数的顺序。

因此,结果应该是:

someId
someId
someClass
someId
仅当 @id 不存在时才应采用

@class

我知道,它可以用条件逻辑来完成,但我真的对一个简短的解决方案很感兴趣,因为它很常见并且用作属性值模板

这可能很明显,我错过了优雅的那个。

请注意,我所说的是 XPath 1.0

最佳答案

使用:

@id | @class[not(../@id)]

这个 XPath 表达式总是选择一个节点:@id 如果它存在,只有当 @id 不存在时 @class.

所以这个转变:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>

<xsl:output method="text"/>

<xsl:template match="foo/*">
<xsl:value-of select="@id | @class[not(../@id)]"/>
<xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<foo>
<bar id="someId" class="someClass"/>
<buz class="someClass" id="someId"/>
<ololo class="someClass"/>
<test id="someId"/>
</foo>

产生想要的、正确的结果:

someId
someId
someClass
someId

关于xslt - 在单行 Xpath 1.0 中保留操作数的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631542/

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