XML в XML с использованием XSL - PullRequest
0 голосов
/ 25 января 2010

Я хотел бы преобразовать XML-файл в другой XML-файл с другой структурой, используя XSL, и я немного новичок в XSL. Раздел ввода XML выглядит следующим образом:

<set>
    <object> Value </object>
        <name> Value </name>
        <tag>
            <event> Value </event>
            <group> Value </group>
            <other> Value </other>
        </tag>
    <object>
    <object>...</object>
</set>

Я бы хотел, чтобы желаемый результат был:

<set>
    <event>
        <group>
            <object name="value">
                <tag>
                    <other> Value </other>
                </tag>
            </object>
        <group>
        <group>...</group>
    <event>...</event>
</set>

То есть я хотел бы найти во входном XML-файле и сгруппировать объекты в соответствии с узлами 'события', за которыми следуют узлы 'группы' с тем же значением. Помощь

1 Ответ

0 голосов
/ 25 января 2010

Если вы процессор xslt поддерживает exslt, вы можете использовать set: Different, чтобы зацикливать отдельные события и отдельные группы, которые имеют это событие. Я протестировал следующее с xsltproc, но они должны работать на любом процессоре, который поддерживает функцию exslt :. см .: http://www.exslt.org/func/elements/function/index.html.

Обращаем ваше внимание, что в реализации set есть ошибка: есть посты, которые я здесь исправил.

test.xslt:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:func="http://exslt.org/functions"
                xmlns:set="http://exslt.org/sets"
                extension-element-prefixes="func set">

<xsl:import href="set.distinct.function.xsl" />

<xsl:template match="set">
  <set>
  <xsl:variable name="set" select="."/>
  <xsl:value-of select="count(object/tag/event)"/><xsl:text> </xsl:text>
  <xsl:value-of select="count(set:distinct(object/tag/event))"/>
  </xsl:for-each>
  <xsl:for-each select="set:distinct(object/tag/event)">
    <event>
    <xsl:attribute name="name">
      <xsl:value-of select="."/>
    </xsl:attribute>
    <xsl:variable name="event" select="." />
    <xsl:for-each select="set:distinct($set/object/tag[event=$event]/group)">
      <group>
      <xsl:attribute name="name">
        <xsl:value-of select="."/>
      </xsl:attribute>
      <xsl:variable name="group" select="." />
      <xsl:apply-templates select="$set/object[tag/event=$event][tag/group=$group]" />
      </group>
    </xsl:for-each>
    </event>
  </xsl:for-each>
  </set>
</xsl:template>
<xsl:template match="object">
  <object name="{name}"/>
</xsl:template>
</xsl:stylesheet>

set.distinct.function.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/functions"
                xmlns:set="http://exslt.org/sets"
                extension-element-prefixes="exsl"
                exclude-result-prefixes="set">

<exsl:function name="set:distinct">
   <xsl:param name="nodes" select="/.." />
   <xsl:choose>
      <xsl:when test="not($nodes)">
         <exsl:result select="/.." />
      </xsl:when>
      <xsl:otherwise>
         <xsl:variable name="distinct" 
                       select="set:distinct($nodes[position() > 1])" />
         <exsl:result select="$distinct | $nodes[1][not(. = $distinct)]" />
      </xsl:otherwise>
   </xsl:choose>
</exsl:function>

</xsl:stylesheet>

test.xml:

<set>
    <object>
        <name> Value1 </name>
        <tag>
            <event> Value </event>
            <group> Value </group>
            <other> Value </other>
        </tag>
    </object>
    <object>
        <name> Value2 </name>
        <tag>
            <event> Value </event>
            <group> Value2 </group>
            <other> Value </other>
        </tag>
    </object>
    <object>
        <name> Value3 </name>
        <tag>
            <event> Value </event>
            <group> Value2 </group>
            <other> Value </other>
        </tag>
    </object>
    <object>
        <name> Value4 </name>
        <tag>
            <event> Value </event>
            <group> Value </group>
            <other> Value </other>
        </tag>
    </object>
    <object>
        <name> Value5 </name>
        <tag>
            <event> Value2 </event>
            <group> Value </group>
            <other> Value </other>
        </tag>
    </object>
    <object>
        <name> Value6 </name>
        <tag>
            <event> Value2 </event>
            <group> Value </group>
            <other> Value </other>
        </tag>
    </object>
</set>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...