2014-02-10 7 views
1

Я начинающий обучение XSL и мне нужна помощь с XSL-файла, чтобы преобразовать свой оригинальный XML, который выглядит какгруппы элементов к новому родительскому узлу (XSLT)

<dataroot> 
    <pod> 
     <id>1</id> 
     <mfp> 
     <type>1</type> 
     <val>10</val> 
     </mfp> 
     <mfp> 
     <type>2</type> 
     <val>12</val> 
     </mfp> 
    </pod> 
    <pod> 
     <id>2</id> 
     <mfp> 
     <type>1</type> 
     <val>100</val> 
     </mfp> 
    </pod> 
</dataroot> 

И мне нужно, чтобы иметь новый MFPs узел, который содержит все элементы mfp для одного контейнера, например

<dataroot> 
    <pod> 
     <id>1</id> 
     <MFPS> 
     <mfp> 
      <type>1</type> 
      <val>10</val> 
     </mfp> 
     <mfp> 
      <type>2</type> 
      <val>12</val> 
     </mfp> 
     </MFPS> 
    </pod> 
    <pod> 
     <id>2</id> 
     <MFPS> 
     <mfp> 
      <type>1</type> 
      <val>100</val> 
     </mfp> 
     </MFPS> 
    </pod> 
</dataroot> 

Пожалуйста, помогите мне, как это решить. Благодаря

+1

Ваш вклад имеет только один элемент "стручок" (корневой узел). Но на вашем выходе, похоже, больше их (выход не может иметь более одного корневого узла, но это не относится к вашему выходу). Не могли бы вы быть более четкими, разместив полный ввод и вывод XML? –

+0

Оригинальный XML выглядит как [code] .... [/ код] Существует только один корень , и многие ... узлы – user3294104

+0

Просто отредактированный вопрос – user3294104

ответ

0

Используйте этот шаблон:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="pod"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()[not(name() = 'mfp')]"/> 
     <MFPS> 
     <xsl:apply-templates select="mfp"/> 
     </MFPS> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Он работает, но в результате файл находится в одном линия. Как получить разрывы строк? – user3294104

+0

Я нашел решение, чтобы сохранить разрывы строк из исходного xml, должен добавить: user3294104

0

С XSLT 2.0, вы можете использовать для-каждой группе

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="pod"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="if (self::mfp) then 1 else 0"> 
       <xsl:choose> 
        <xsl:when test="current-grouping-key()"> 
         <MFPS> 
          <xsl:apply-templates select="current-group()"/> 
         </MFPS> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы