如何使用xsl将标记替换为xml中的另一个标记

时间:2011-05-24 15:26:44

标签: xslt

我的xml文件如下所示。

<rule>  
  <name>86</name>
  <ruleId>100</ruleId>
  <ruleVersion>1.0</ruleVersion>
  <brlVersion>1.0</brlVersion>
</rule>

我需要用brlName替换name,我需要添加另一个标签作为drlName。输出应该如下所示。

<rule>  
  <brlName>86</brlName>
  <ruleId>100</ruleId>
  <ruleVersion>1.0</ruleVersion>
  <brlVersion>1.0</brlVersion>
  <drlName>86_1.0</drlName>
</rule>

请帮助我使用相应的xsl来获得所需的输出。 感谢你的帮助!

2 个答案:

答案 0 :(得分:6)

这是身份转换的典型任务(下面转换中的第一个模板规则)。只有两个覆盖(最后两个规则)。


Saxon 6.5.5 下测试

XSLT 1.0

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="name">
        <brlName><xsl:value-of select="."/></brlName>
    </xsl:template>

    <xsl:template match="brlVersion">
        <xsl:copy-of select="."/>
        <drlName><xsl:value-of select="preceding-sibling::name"/>_1.0</drlName>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:3)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

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

 <xsl:template match="/*/*[last()]">
  <xsl:call-template name="identity"/>
   <drlName>86_1.0</drlName>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<rule>
    <name>86</name>
    <ruleId>100</ruleId>
    <ruleVersion>1.0</ruleVersion>
    <brlVersion>1.0</brlVersion>
</rule>

会产生想要的正确结果:

<rule>
   <brlName>86</brlName>
   <ruleId>100</ruleId>
   <ruleVersion>1.0</ruleVersion>
   <brlVersion>1.0</brlVersion>
   <drlName>86_1.0</drlName>
</rule>

<强>解释

  1. 使用和覆盖身份规则/模板 - 最基本,最强大的XSLT设计模式。

  2. 覆盖任何名为name的元素并创建名为brlName的元素(重命名)。

  3. 覆盖顶部元素的最后一个元素子元素。按名称为此节点调用身份规则(复制),然后根据要求创建具有特定文本节点子项的名为drlName的元素。

  4. 使用和覆盖标识规则/模板是最基本和最强大的XSLT设计模式。您可以详细了解here