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

时间:2015-01-08 11:34:27

标签: xml xslt xslt-1.0

我是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中有一个模板匹配,这样对于树中的标签&#34; abc / def / ghi&#34;,匹配模式&#39; hello * XYZ&#39; (以&#39; hello&#39;开头,以&#39; XYZ&#39;结尾),里面的值应该被零替换。

这样输出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>

任何人都可以帮忙。感谢。

1 个答案:

答案 0 :(得分:2)

假设使用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>