如何使用XSLT转换XML只修改所需的节点?

时间:2016-02-08 05:05:43

标签: xml xslt

我正在尝试仅将XML转换为用另一个替换节点名称,但是我构建的XSLT正在搞乱转换后的XML。这可能是一个我可能忽略的小问题,但很长一段时间我都坚持这个问题。

输入我拥有的XML:

<?xml version="1.0" encoding="UTF-8"?>
<dataCollection>
    <queryConst language="DBSQL">
        <queryUsed>
            SELECT EMP.FirstName, EMP.LastName FROM (SELECT FirstName, LastName FROM
            employees WHERE EmployeeID &lt; 10) AS EMP
        </queryUsed>
    </queryConst>
    <record>
        <old>
            <Employees>
                <FirstName>James</FirstName>
                <LastName>Gosling</LastName>
            </Employees>
        </old>
    </record>
    <record>
        <old>
            <Employees>
                <FirstName>Rod</FirstName>
                <LastName>Johnson</LastName>
            </Employees>
        </old>
    </record>
</dataCollection>

使用的XSLT如下:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="dataCollection/queryConst/@language">
        <xsl:attribute name="language">DBVIEW</xsl:attribute>
    </xsl:template>
    <xsl:template match="dataCollection/record/old/Employees">
        <xsl:element name="TABLE">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我想要的输出XML如下:

<?xml version="1.0" encoding="UTF-8"?>
<dataCollection>
    <queryConst language="DBVIEW">
        <queryUsed>
            SELECT EMP.FirstName, EMP.LastName FROM (SELECT FirstName,
            LastName FROM employees WHERE EmployeeID &lt; 10) AS EMP
        </queryUsed>
    </queryConst>
    <record>
        <old>
            <TABLE>
                <FirstName>James</FirstName>
                <LastName>Gosling</LastName>
            </TABLE>
        </old>
    </record>
    <record>
        <old>
            <TABLE>
                <FirstName>Rod</FirstName>
                <LastName>Johnson</LastName>
            </TABLE>
        </old>
    </record>
</dataCollection>

非常感谢上述任何帮助/提示/建议。

1 个答案:

答案 0 :(得分:1)

您需要从匹配xsl:copy的模板中删除Employees。此外,当元素名称已知时,无需使用xsl:element。试试吧:

<xsl:template match="dataCollection/record/old/Employees">
    <TABLE>
        <xsl:apply-templates/>
    </TABLE>
</xsl:template>

另请注意,match 模式不是select 表达式。除非输入XML中的其他位置有其他Employees节点,否则无需使用该路径。使用给定的示例,

<xsl:template match="Employees">

就足够了。