gpt4 book ai didi

xml - xsl :template match attribute 中的正则表达式

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

我只想知道是否可以在 xsl:template 元素的 match 属性中使用正则表达式。例如,假设我有以下 XML 文档:

<greeting>
<aaa>Hello</aaa>
<bbb>Good</bbb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>

现在 XSLT 转换上述文件:

<xsl:stylesheet>

<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="matches(node-name(*),'line')">
<xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

当我尝试在 xsl:template 的 match 属性中使用语法 matches(node-name(*),'line$') 元素,它检索错误消息。我可以在 match 属性中使用正则表达式吗?

非常感谢

最佳答案

这里是正确的 XSLT 1.0 匹配方式(在 XSLT 2.0 中使用 matches() 函数和真正的 RegEx 作为 pattern 参数):

匹配名称包含'line'的元素:

<xsl:template match="*[contains(name(), 'line')]"> 
<!-- Whatever processing is necessary -->
</xsl:template>

匹配名称以'line'结尾的元素:

<xsl:template match="*[substring(name(), string-length() -3) = 'line']"> 
<!-- Whatever processing is necessary -->
</xsl:template>

@Tomalak 提供了另一种 XSLT 1.0 方法来查找以给定字符串结尾的名称。他的解决方案使用了一个特殊字符,保证不会出现在任何名称中。我的解决方案可用于查找是否有任何字符串(不仅是元素名称)以另一个给定字符串结尾。

在 XSLT 2.x 中:

使用:matches(name(), '.*line$') 匹配以字符串 "line" 结尾的名称

这个转换:

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

<xsl:template match="*[matches(name(), '.*line$')]">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="*[not(matches(name(), '.*line$'))]">
<xsl:apply-templates select="node()[not(self::text())]"/>
</xsl:template>
</xsl:stylesheet>

应用于 XML 文档时:

<greeting>
<aaa>Hello</aaa>
<bblineb>Good</bblineb>
<ccc>Excellent</ccc>
<dddline>Line</dddline>
</greeting>

仅将名称以字符串 "line" 结尾的元素复制到输出:

<dddline>Line</dddline>

虽然此转换(使用 matches(name(), '.*line') ):

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

<xsl:template match="*[matches(name(), '.*line')]">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="*[not(matches(name(), '.*line'))]">
<xsl:apply-templates select="node()[not(self::text())]"/>
</xsl:template>
</xsl:stylesheet>

将名称包含字符串"line"的所有元素复制到输出:

<bblineb>Good</bblineb>
<dddline>Line</dddline>

关于xml - xsl :template match attribute 中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081189/

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