2015-09-21 6 views
0
<?xml version="1.0"?> 
<parent id="38" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <child id="1" colorType="firstColor" colorKey="blue"/> 
    <child id="2" colorType="secondColor" colorKey="red"/> 
</parent> 

Так что у меня предыдущий XML, и я хотел бы, чтобы преобразовать его, используя XSLT, следующим образом:XSLT преобразование дочернего элемента атрибута в родительском

<?xml version="1.0"?> 
<parent id="38" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
firstColor="blue" secondColor="red"> 
</parent> 

Так два значения от ребенка элемент, который будет использоваться как атрибут пары в родительском элементе, удалив дочерний элемент в процессе. Я пробовал, но не могу окунуться в то, что похоже на основы XSLT.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="parent"> 
    <parent> 
     <xsl:apply-templates/> 
    </parent> 
    </xsl:template> 

    <xsl:template match="parent"> 
    <parent> 
     <xsl:attribute name="{@colorType}"> 
     <xsl:value-of select="@colorKey"/> 
     </xsl:attribute> 
    </parent> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

1

Я хотел бы пойти на что-то вроде следующего, то есть, просто применяя шаблоны child и соответствие его, так что каждый ребенок превратится в атрибутах:

<xsl:template match="parent"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="child" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="child"> 
    <xsl:attribute name="{@colorType}" select="@colorKey" /> 
</xsl:template> 

Я вообще предпочитаю применять шаблоны для-каждого» через набор узлов, поскольку его легче адаптировать позже и, как правило, легче следовать.

+0

отредактировал исходное сообщение. Прости, уже поздно, и я немного ленился. – Entomo

+1

@Entomo, не проблема;) Я сотрую свои замечания :) – Abel

+0

Я добавил новый вопрос относительно этого. Кажется, что порядок элементов играет роль, когда выполняется «синтаксический анализ». – Entomo

2

Вы на правильном пути, но вы на самом деле нужно создать атрибут для каждого child элемента под parent, так что вы можете использовать xsl:for-each здесь:

Попробуйте заменить свой parent шаблон с этим:

<xsl:template match="parent"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="child"> 
      <xsl:attribute name="{@colorType}"> 
       <xsl:value-of select="@colorKey" /> 
      </xsl:attribute> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

Также обратите внимание на использование xsl:copy-of для копирования существующих атрибутов. Также обратите внимание на использование <xsl:copy> вместо того, чтобы просто делать <parent>, так как это обеспечит скопирование объявления пространства имен для «xsi».

+0

Я как раз собирался нажать «Опубликовать» на тот же ответ. Но у меня также была эта заметка: это предполагает, что каждый ребенок имеет уникальное значение colorType (иначе они будут перезаписывать друг друга) и что это значение является допустимым именем атрибута. –

+0

@ michael.hor257k у них будут уникальные значения colorType – Entomo

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