我已经接受了使用xsl在工作中更新我们的一些xml文档的任务,我一直在寻找xsl的一些教程,虽然我还没有看到我理想的样子为...
因为我不在工作,所以我想要的是一个小例子:
<?xml version="1.0" encoding="UTF-8"?>
<application>
<id>627</id>
<name>application1</name>
<url>www.application.com</url>
</application>
我需要将其转换为:
<?xml version="1.0" encoding="UTF-8"?>
<application>
<id>627</id>
<application_name>application1</application_name>
<url>www.application.com</url>
</application>
现在从我见过的示例和教程中我可以使用硬编码的xsl表单来完成这个:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<application>
<xsl:apply-templates/>
</application>
</xsl:template>
<xsl:template match="id">
<id>
<xsl:value-of select="id"/>
<xsl:apply-templates/>
</id>
</xsl:template>
<xsl:template match="name">
<application_name>
<xsl:value-of select="name"/>
<xsl:apply-templates/>
</application_name>
</xsl:template>
<xsl:template match="url">
<url>
<xsl:value-of select="url"/>
<xsl:apply-templates/>
</url>
</xsl:template>
</xsl:stylesheet>
但是这真的不实用,因为我们有近50个不同的xml文档可能需要更改,所以我真的在寻找一个可以使用的捕获所有模板,然后只覆盖需要更改的相应元素
xsl中是否存在此功能?
答案 0 :(得分:2)
让我看看我是否理解你的需要。下面转换中的第一个模板规则称为 identity transform 通过复制它们来处理所有节点,并且可以覆盖单个元素,属性,注释,处理指令或文本节点。在您的情况下,我刚刚覆盖了元素name
。
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">
<xsl:variable name="parent" select="name(parent::*[1])"/>
<xsl:variable name="node" select="local-name()"/>
<xsl:element name="{$parent}_{$node}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于此输入:
<?xml version="1.0" encoding="UTF-8"?>
<anyapplication>
<id>627</id>
<name>application1</name>
<url>www.application.com</url>
</anyapplication>
产地:
<?xml version="1.0" encoding="UTF-8"?>
<anyapplication>
<id>627</id>
<anyapplication_name>application1</anyapplication_name>
<url>www.application.com</url>
</anyapplication>
答案 1 :(得分:0)
您可以尝试这样的事情:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="name">
<application_name>
<xsl:value-of select="name"/>
<xsl:apply-templates/>
</application_name>
</xsl:template>
<xsl:template match="not(name)">
<xsl:copy-of select="."/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>