我的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来获得所需的输出。 感谢你的帮助!
答案 0 :(得分:6)
这是身份转换的典型任务(下面转换中的第一个模板规则)。只有两个覆盖(最后两个规则)。
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>
<强>解释强>:
使用和覆盖身份规则/模板 - 最基本,最强大的XSLT设计模式。
覆盖任何名为name
的元素并创建名为brlName
的元素(重命名)。
覆盖顶部元素的最后一个元素子元素。按名称为此节点调用身份规则(复制),然后根据要求创建具有特定文本节点子项的名为drlName
的元素。
使用和覆盖标识规则/模板是最基本和最强大的XSLT设计模式。您可以详细了解here 。