2016-03-09 1 views
0

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

Источник:

<root name="root 1"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value="val2"/> 
    <elem id="chair" value="val3"/> 
</root> 

Wanted результат:

<root name="root 1"> 
    <container name="lang"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value="val2"/> 
    </container> 
    <elem id="chair" value="val3"/> 
</root> 

Дополнительный улов: есть вероятность, что не все цели для гнездования будут доступны. Тем не менее, они должны быть вложены в пустые значения.

Источник:

<root name="root 1"> 
    <elem id="java" value="val1"/> 
    <elem id="chair" value="val3"/> 
</root> 

Цель:

<root name="root 1"> 
    <container name="lang"> 
    <elem id="java" value="val1"/> 
    <elem id="python" value=""/> 
    </container> 
    <elem id="chair" value="val3"/> 
</root> 

Мои результаты держать повторять container. Как я могу преобразовать его по назначению?

+0

Можете ли вы разместить шаблон, который * повторял 'container' *? – har07

+0

XSLT 1.0 или 2.0? – har07

+0

версия 2.0 ... – Saran

ответ

0

Вы можете перебрать списки строк в XSLT 2.0. Таким образом, это может сделать работу:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

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


    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:variable name="elems" select="elem"/> 
     <container> 
     <xsl:for-each select="('java', 'python')"> 
      <elem id="{.}" value="{string($elems[@id=current()]/@value)}"/> 
     </xsl:for-each> 
     </container> 

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

    <xsl:template match="elem[@id=('java', 'python')]"/> 
</xsl:stylesheet> 
+0

Выполняет эту работу. Благодаря :) – Saran

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