2013-12-10 2 views
-1

Tim - спасибо! То, что вы предоставили на основе моего ввода, безусловно, работает! Я, однако, пал жертвой своего собственного эго. Мой первоначальный вход был sctructurally уменьшенная версия моего фактического файла XML, и я думал, что я мог бы применить концепцию вашей помощи и получить то, что мне нужно, в конце концов ... Угадайте, что? Хотя изменение незначительное, я все еще не могу. Некоторое количество вариаций/корректировок для кода, включая использование полного пути в «copy-of select =», просто не помещает KEY под ДОКУМЕНТОМ. Единственный способ, которым это работает, - использовать «xsl: copy-of select =» // KEY «/».перемещения элемента уровня родительского к обхвату группе дочерних элементов

Другая проблема, с которой я столкнулся, заключается в том, как обеспечить, чтобы только «КЛЮЧ», в котором находится «Документ», копируется под этот «Документ» ... С кодом «как есть» все элементы в XML копируется на каждый из узлов (опять же, только когда я использую оператор «//»).

Пожалуйста, помогите.

Вот мой НЕ масштабируется вниз структура:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <KEY><![CDATA[keyword1]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <KEY><![CDATA[keyword2]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

Мой желаемый результат:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

К сожалению ... И, опять же, спасибо.

+0

почему у вас нет ничего, как еще не работает? что вы на самом деле пытались? – Hilikus

ответ

1

Во-первых, вам нужно прочитать на identity transform, который выглядит следующим образом

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

Это будет копировать все узлы на выходных документов без изменения. Это означает, что вам нужно только писать шаблоны для вещей, которые вам нужно изменить.

Вы также не должны действительно думать об этом перемещении элемента, но из двух изменений; Удаление KEY элемента из-под Документами элемента, а затем добавить новый KEY элемента (то есть копия существующего) под Документом.

Снятие KEY элемент прямолинейный. Просто матч, и ничего не делать

<xsl:template match="KEY" /> 

Добавление нового элемента под Document элемента, также прямо вперед. Вам нужен шаблон, соответствующий Document элемента, который будет похож на шаблон идентичности, но с дополнительной копией, чтобы скопировать KEY узла из родительских.

<xsl:template match="Document"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

Так вы копируете Документ элемент, копировать через атрибуты (если таковые имеются), скопируйте KEY от родителя, а затем продолжить обработку дочерних узлов.

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="KEY" /> 

    <xsl:template match="Document"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

EDIT: В качестве альтернативы, если KEY не является дочерним родительского узла, но может на любой глубине, попробуйте заменить оператор копирования с этим вместо

<xsl:copy-of select="ancestor::*[KEY]/KEY" /> 

Это должно справиться с документом элементом является на любом уровне.

0

Хорошо, наконец .... Вот оригинальный xsl Тима (с крошечной настройкой), что дает мне желаемый результат. Тим - еще раз спасибо. XSLT находится за пределами моей компетенции. Я просто пытаюсь использовать это «препарат» инструмент:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 

<xsl:template match="KEY" /> 

<xsl:template match="Document"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:copy-of select="../../KEY" /> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

Я внес изменения в свой первоначальный ответ, чтобы справиться с элементами ** Document **, вложенными в более глубокие уровни, и поэтому будет работать с вашим оригинальным XML и вашим последним примером. –

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

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