XML到XML xsl样式表

时间:2011-05-23 20:37:44

标签: xml xslt

我已经接受了使用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中是否存在此功能?

2 个答案:

答案 0 :(得分:2)

让我看看我是否理解你的需要。下面转换中的第一个模板规则称为 identity transform 通过复制它们来处理所有节点,并且可以覆盖单个元素,属性,注释,处理指令或文本节点。在您的情况下,我刚刚覆盖了元素name


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">
        <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>