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