我正在将一个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元素之外的所有内容。
答案 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(没有单个根元素)。