更改具有与特定正则表达式模式匹配的标记的 xml 树中的值

Posted

技术标签:

【中文标题】更改具有与特定正则表达式模式匹配的标记的 xml 树中的值【英文标题】:Change value in xml tree having a tag that matches particular regex patterm 【发布时间】:2015-03-06 12:16:51 【问题描述】:

我是 xsl 新手,遇到了一个问题。

我有一个类似的 xml:

<abc>
    <def>
        <ghi>
            <hello:abcXYZ>1</hello:abcXYZ>
            <hello:defXYZ>10</hello:defXYZ>
            <hello:defXYZ>11</hello:defXYZ>
            <hello>5<hello>
        </ghi>
    </def>
</abc>

我想在 xsl 中进行模板匹配,这样对于树“abc/def/ghi”中的标签,匹配模式“hello*XYZ”(以“hello”开头并以“XYZ”结尾),值inside 应该被零替换。

这样输出的xml会是这样的:

<abc>
    <def>
        <ghi>
            <hello:abcXYZ>0</hello:abcXYZ>
            <hello:defXYZ>0</hello:defXYZ>
            <hello:defXYZ>0</hello:defXYZ>
            <hello>5<hello>
        </ghi>
    </def>
</abc>

有人可以帮忙吗?谢谢。

【问题讨论】:

您已使用 both XSLT 1.0 和 2.0 标记了您的问题 - 您实际需要这两者中的哪一个? 【参考方案1】:

假设 XSLT 2.0 将您的描述转换为正则表达式模式和匹配模式并不难:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="pattern" select="'hello.*XYZ'"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="abc/def/ghi/*[matches(name(), $pattern)]">
  <xsl:copy>0</xsl:copy>
</xsl:template>

</xsl:stylesheet>

改变

<abc xmlns:hello="http://example.com/">
    <def>
        <ghi>
            <hello:abcXYZ>1</hello:abcXYZ>
            <hello:defXYZ>10</hello:defXYZ>
            <hello:defXYZ>11</hello:defXYZ>
            <hello>5</hello>
        </ghi>
    </def>
</abc>

进入

<abc xmlns:hello="http://example.com/">
    <def>
        <ghi>
            <hello:abcXYZ>0</hello:abcXYZ>
            <hello:defXYZ>0</hello:defXYZ>
            <hello:defXYZ>0</hello:defXYZ>
            <hello>5</hello>
        </ghi>
    </def>
</abc>

【讨论】:

我可以用 XSLT 1 做些什么? 如果您将match="abc/def/ghi/*[matches(name(), $pattern)]" 更改为match="abc/def/ghi/*[starts-with(name(), 'hello') and substring(name(), string-length(name()) - 2) = 'XYZ']",您的模式应该适用于 XSLT 1.0 是的,我会试试...谢谢

以上是关于更改具有与特定正则表达式模式匹配的标记的 xml 树中的值的主要内容,如果未能解决你的问题,请参考以下文章

用于匹配具有特定属性的 HTML 标记的正则表达式 [重复]

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记

正则表达式与特定模式完全匹配 10 位数字

正则表达式匹配引号外的逗号 - XML 模式变体

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

如何修改与 Python 中特定正则表达式匹配的文本?