xsl:用正则表达式替换节点名称

时间:2015-11-11 16:14:48

标签: regex xml xslt

有一种方法可以替换以特定字符串开头的所有节点的名称吗?

示例:

<ABCDocument ... >
    <ABCElement ... />
    ....
    <ABCElement ... />
</ABCDocument>

期望的输出:

<XYZDocument ... >
    <XYZElement ... />
    ....
    <XYZElement ... />
</XYZDocument>

简而言之,我需要的是在所有节点名称中用前缀XYZ替换前缀ABC。 有办法实现这个目标吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

要使用replace函数,您需要一个XSLT 2.0处理器,如Saxon 9或XmlPrime或AltovaXML,但对于您的简单情况,您可以编写例如。

<xsl:template match="*[starts-with(local-name(), 'ABC')]">
  <xsl:element name="XYZ{substring(local-name(), 4)}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

当然,对于整个工作方法,还要使用身份转换模板

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

,不加改变地复制其他节点并保持处理。