Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT复制完整的XML元素_Xml_Xslt - Fatal编程技术网

使用XSLT复制完整的XML元素

使用XSLT复制完整的XML元素,xml,xslt,Xml,Xslt,我正在将一个XML文件转换为另一个。我想将一个完整的元素从原始xml复制到新xml中。我尝试过使用身份转换,但只有在复制整个文档时才能实现。如果我试图限制为仅一个元素(其中包含大量数据),那么我将获得文档中所有内容的值,而不是xml标记,也不仅仅是所需元素中的内容。我对XSLT比较陌生,因此可能没有正确理解标识转换过程 以下是我的示例输入: <?xml version="1.0" encoding="utf-8"?> <DataExtract Version="1.0">

我正在将一个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>

出口
乌万特达塔
Unwantedatab
未完成的任务
乌万特达德
基础知识
DEF
GHI
绝对想要
我想获取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>

出口
乌万特达塔
Unwantedatab
未完成的任务
乌万特达德
基础知识
DEF
GHI
绝对想要
我真的想要:

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

基础知识
DEF
GHI
绝对想要
我尝试了复制和复制的不同选项,我读到的所有内容都在谈论复制整个文档,可能会排除一些内容。我想排除除EntityData元素之外的所有内容

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

这可以非常简单地通过以下方式实现:

XSLT1.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(没有一个根元素)

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

这可以非常简单地通过以下方式实现:

XSLT1.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(没有一个根元素)

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

这可以非常简单地通过以下方式实现:

XSLT1.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(没有一个根元素)

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

这可以非常简单地通过以下方式实现:

XSLT1.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(没有一个根元素)。

非常感谢!我最初用我的真实数据(当然更复杂)尝试了这种方法,但没有成功。我一定错过了一些简单的事情,结果却走向了完全不同的方向。您能解释一下为什么我的示例中的方法输出的是值而不是xml吗?我只是想了解到底发生了什么。@sldorman您的输出(顺便说一下是XML)包含文本值的原因是您将模板应用于没有模板匹配的元素。在这种情况下,启动-默认操作是复制文本节点。非常感谢!我最初用我的真实数据(当然更复杂)尝试了这种方法,但没有成功。我一定错过了一些简单的事情,结果却走向了完全不同的方向。您能解释一下为什么我的示例中的方法输出的是值而不是xml吗?我只是想了解到底发生了什么。@sldorman您的输出(顺便说一下是XML)包含文本值的原因是您将模板应用于没有模板匹配的元素。在这种情况下,启动-默认操作是复制文本节点。非常感谢!我最初用我的真实数据(当然更复杂)尝试了这种方法,但没有成功。我一定错过了一些简单的事情,结果却走向了完全不同的方向。您能解释一下为什么我的示例中的方法输出的是值而不是xml吗?我只是想了解到底发生了什么。@sldorman您的输出(顺便说一下是XML)包含文本值的原因是您将模板应用于没有模板匹配的元素。在这种情况下,启动-默认操作是复制文本节点。非常感谢!我最初用我的真实数据(当然更复杂)尝试了这种方法,但没有成功。我一定错过了一些简单的事情,结果却走向了完全不同的方向。您能解释一下为什么我的示例中的方法输出的是值而不是xml吗?我只是想了解到底发生了什么。@sldorman您的输出(顺便说一下是XML)包含文本值的原因是您将模板应用于没有模板匹配的元素。在这种情况下,踢入-默认操作是复制文本节点。