Я переводил один файл XML в другой. Я хочу скопировать один, полный элемент из исходного xml в новый xml. Я попытался использовать преобразование идентичности, но могу только заставить это работать, если я скопирую весь документ. Если я попытаюсь ограничить только один элемент (который содержит много данных), я получаю значения всего в документе, а не теги xml, а не только то, что находится в нужном элементе. Я относительно новичок в XSLT, поэтому я, вероятно, не понимаю процесс преобразования идентичности правильно.Копирование полного 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.
Большое вам спасибо! Я сначала испробовал этот подход с моими реальными данными (что, конечно, сложнее), но это не сработало. Я, должно быть, пропустил что-то простое и оказался в совершенно другом направлении. Можете ли вы объяснить, почему подход в моем примере вывел значения, а не xml? Я просто хочу понять, что происходит на самом деле. – sldorman
@sldorman Причина, по которой ваш вывод (который BTW ** является ** XML) содержит текстовые значения, заключается в том, что вы применяете шаблоны к элементам, которые не имеют соответствующего им шаблона. В таком случае, [встроенные правила шаблонов] (http://www.w3.org/TR/xslt/#built-in-rule) запускаются, а действие по умолчанию - копирование текстовых узлов. –