繁体   English   中英

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

[英]How to transform a XML using XSLT only modifying a node that's required?

我正在尝试仅转换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>

上面的任何帮助/提示/建议都非常感谢。

您需要从与模板匹配的Employees删除xsl:copy 另外,当元素名称已知时,也无需使用xsl:element 简单尝试:

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

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

<xsl:template match="Employees">

足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM