问题描述
|
我的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设计模式。您可以在此处了解更多信息。