2015-06-10 3 views
0

Я переводил один файл 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.

ответ

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 в результате (не имея ни одного корневого элемента).

+0

Большое вам спасибо! Я сначала испробовал этот подход с моими реальными данными (что, конечно, сложнее), но это не сработало. Я, должно быть, пропустил что-то простое и оказался в совершенно другом направлении. Можете ли вы объяснить, почему подход в моем примере вывел значения, а не xml? Я просто хочу понять, что происходит на самом деле. – sldorman

+0

@sldorman Причина, по которой ваш вывод (который BTW ** является ** XML) содержит текстовые значения, заключается в том, что вы применяете шаблоны к элементам, которые не имеют соответствующего им шаблона. В таком случае, [встроенные правила шаблонов] (http://www.w3.org/TR/xslt/#built-in-rule) запускаются, а действие по умолчанию - копирование текстовых узлов. –

Смежные вопросы