使用XSLT复制完整的XML元素

时间:2015-06-10 21:07:12

标签: xml xslt

我正在将一个XML文件翻译成另一个。我想将原始xml中的单个完整元素复制到新的xml中。我尝试过使用身份转换,但只有在复制整个文档时才能使用。如果我尝试限制只有一个元素(包含大量数据),我会得到文档中所有内容的值 - 而不是xml标记,而不仅仅是所需元素中的内容。我对XSLT比较陌生,所以我可能没有正确理解身份转换过程。

以下是我的示例输入:

<?xml version="1.0" encoding="utf-8"?>
<DataExtract Version="1.0">
    <ImportExport>Export</ImportExport>
    <Entities>
        <Entity>
            <Data>UnwantedDataA</Data>
            <Data>UnwantedDataB</Data>
        </Entity>
        <Entity>
            <Data>UnwantedDataC</Data>
            <Data>UnwantedDataD</Data>
        </Entity>
        <Entity>
            <EntityData>
                <Data>ABC</Data>
                <Data>DEF</Data>
                <Data>GHI</Data>
                <SpecialData id="1">Definitely wanted</SpecialData>
            </EntityData>
        </Entity>
    </Entities>
</DataExtract>

我想获取EntityData元素并将其与输入中的完全相同。

如果我使用以下内容复制整个输入文档,我会使用xml标签等完整复制。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

但是,如果我尝试仅使用以下代码获取EntityData元素:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="EntityData">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我得到的是值而不是xml和整个文档,而不仅仅是EntityData:

<?xml version="1.0" encoding="UTF-8"?>
    Export


            UnwantedDataA
            UnwantedDataB


            UnwantedDataC
            UnwantedDataD


            <EntityData>
                ABC
                DEF
                GHI
                Definitely wanted
            </EntityData>

我真的想要:

<?xml version="1.0" encoding="utf-8"?>
<EntityData>
    <Data>ABC</Data>
    <Data>DEF</Data>
    <Data>GHI</Data>
    <SpecialData id="1">Definitely wanted</SpecialData>
</EntityData>

我尝试过复制和复制的不同选项,我读过的所有内容都是关于复制整个文档并可能排除一些内容。我想排除除EntityData元素之外的所有内容。

1 个答案:

答案 0 :(得分:3)

  

我想排除除EntityData元素之外的所有内容。

这可以通过以下方式实现:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/DataExtract">
    <xsl:copy-of select="Entities/Entity/EntityData"/>
</xsl:template>

</xsl:stylesheet>

但是,假设整个输入文档中只有一个EntityData元素。否则,最终会得到格式错误的XML(没有单个根元素)。