如何使用xsl替换xml中的另一个标签

问题描述

| 我的xml文件如下所示。
<rule>  
  <name>86</name>
  <ruleId>100</ruleId>
  <ruLeversion>1.0</ruLeversion>
  <brlVersion>1.0</brlVersion>
</rule>
我需要用brlName替换名称,并需要添加一个标签作为drlName。输出应如下所示。
<rule>  
  <brlName>86</brlName>
  <ruleId>100</ruleId>
  <ruLeversion>1.0</ruLeversion>
  <brlVersion>1.0</brlVersion>
  <drlName>86_1.0</drlName>
</rule>
请用相应的xsl帮助我,以获得所需的输出。 感谢您的帮助!     

解决方法

这是身份转换(以下转换中的第一个模板规则)的典型任务。仅有两个替代(最后两个规则)。 XSLT 1.0在Saxon 6.5.5下进行了测试
<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>
    ,此转换:
<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>
说明: 使用和覆盖身份规则/模板-最基本,最强大的XSLT设计模式。 覆盖任何名为
name
的元素,并创建一个名为
brlName
的元素(重命名)。 覆盖top元素的最后一个last子元素。通过名称为此节点调用身份规则(复制),然后根据要求创建一个具有特定文本节点子元素的名为“ 8”的元素。 使用和覆盖身份规则/模板是最基本,最强大的XSLT设计模式。您可以在此处了解更多信息。