gpt4 book ai didi

xml - XSLT 如果属性存在/否则

转载 作者:数据小太阳 更新时间:2023-10-29 01:50:29 25 4
gpt4 key购买 nike

我对 XSLT 很陌生,因此我想知道检查属性是否存在的最佳做法是什么。我的 XML 看起来像这样:

<root>
<languages>
<lang id="EN">English<lang>
<lang id="FR">French<lang>
<lang id="DE">German</lang>
</languages>
<items>
<item lang="EN">test 1</item>
<item>test 2</item>
<item lang="FR">item 3</item>
</items>
</root>

请注意,“item”元素的“lang”属性是可选的。

现在我想使用 -loop 遍历项目,同时检查它是否具有“lang”属性。如果是这样,我想使用 ID 获取整个字符串(例如 EN -> 'English')。如果未设置该属性,我希望它写入“未设置语言”或类似内容。

现在我使用以下代码,但我在问自己是否不能以更有效的方式完成它。

<xsl:for-each select="//root/items/item">
<xsl:variable name="cur_lang" select="@lang" /> <!-- first I store the attr lang in a variable -->
<xsl:choose>
<xsl:when test="@lang"> <!-- then i test if the attr exists -->
<xsl:value-of select="//root/languages/lang[@id=$cur_lang]" /> <!-- if so, parse the element value -->
</xsl:when>
<xsl:otherwise>
No language set <!-- else -->
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>

有什么建议/提示吗?

最佳答案

使用 key 可能更有效。您使用模板外的顶级元素定义键

<xsl:key name="langByCode" match="lang" use="@id" />

然后在循环中你可以简单地说

<xsl:when test="@lang"> <!-- then i test if the attr exists -->
<xsl:value-of select="key('langByCode', @lang)" />
</xsl:when>

但一般来说,更自然的 XSLT 方法是使用模板匹配而不是 for-eachif :

<xsl:template match="item[@lang]">
<xsl:value-of select="key('langByCode', @lang)" />
</xsl:template>

<xsl:template match="item">
<xsl:text>No language set</xsl:text>
</xsl:template>

有了这些模板,您就可以执行 <xsl:apply-templates select="/root/items/item" />它会自动为每个项目选择合适的模板。规则是它将使用最具体的模板,因此 item[@lang]一个用于那些具有 lang 的项目属性和平原 item一个给那些不这样做的人。

第三种可能性是我在 SO 上学到的一个小技巧,将整个 if/else 检查放入单个 XPath 表达式中

<xsl:value-of select="
substring(
concat('No language set', key('langByCode', @lang)),
1 + (15 * boolean(@lang))
)" />

这里的技巧是 boolean(@lang)当被视为数字时是 1如果 lang 属性存在并且 0如果没有。如果有lang="EN" ,比方说,然后我们构造一个字符串 "No language setEnglish"然后取从第 16 个字符开始的子串,即 "English" .如果没有 lang 属性,我们构造字符串 "No language set" (因为空节点集的字符串值为空字符串)从第一个字符(即整个字符串)开始取子串。

您可以对其他属性使用相同的技巧,例如假设我们有一个可选的颜色属性并且想说 "No color specified"如果不存在,您可以使用

<xsl:value-of select="substring(
concat('No color specified', @color),
1 + (18 * boolean(@color))
)" />

关于xml - XSLT 如果属性存在/否则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347094/

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