извлекать и перемещать узлы через XSLT - PullRequest
2 голосов
/ 05 июля 2010

Мне нужно преобразовать входящий XML, чтобы я мог извлечь все «item» с «category» равным «two» и переместить их в отдельный узел «records» с атрибутом, инициализированным как type = «two».

Вот пример входящего XML.

<datafeed>
<records type="one">
    <purchases>
    <items>
            <item>
                <categorie>one</categorie>
                <intrant>String</intrant>
            </item>
            <item>
                <categorie>two</categorie>
                <intrant>String</intrant>
            </item>
            <item>
                <categorie>one</categorie>
                <intrant>String</intrant>
            </item>
            <item>
                <categorie>two</categorie>
                <intrant>String</intrant>
            </item>                         
        </items>
    </purchases>
    </records>
<exchange/>
<context/>
<pilotage/>
</datafeed>

Вот что я хотел бы:

<datafeed>
<records type="one">
    <purchases>
    <items>
            <item>
                <categorie>one</categorie>
                <intrant>String</intrant>
            </item>
            <item>
                <categorie>one</categorie>
                <intrant>String</intrant>
            </item>                 
        </items>
    </purchases>
    </records>
  <records type="two">
    <purchases>
    <items>
            <item>
                <categorie>two</categorie>
                <intrant>String</intrant>
            </item>
            <item>
                <categorie>two</categorie>
                <intrant>String</intrant>
            </item>                         
        </items>
    </purchases>
    </records>
<exchange/>
<context/>
<pilotage/>
</datafeed>

Теперь у меня есть две «записи», обе инициализируются с предопределенным типом (всегда одна или две). Записи, которые были извлечены, были перемещены, поэтому удалены из исходной записи.

Спасибо

Ответы [ 2 ]

3 голосов
/ 05 июля 2010

Это преобразование :

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

 <xsl:key name="kitemByCategory" match="item"
  use="categorie"/>

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

 <xsl:template match="records">
  <xsl:call-template name="identity"/>

  <xsl:variable name="vCat2Items" select=
   "key('kitemByCategory', 'two')"/>

  <xsl:if test="$vCat2Items">
    <records type="two">
        <purchases>
          <items>
            <xsl:copy-of select="$vCat2Items"/>
          </items>
        </purchases>
    </records>
  </xsl:if>
 </xsl:template>

 <xsl:template match="item[categorie = 'two']"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу дает требуемый, правильный результат :

<datafeed>
   <records type="one">
      <purchases>
         <items>
            <item>
               <categorie>one</categorie>
               <intrant>String</intrant>
            </item>
            <item>
               <categorie>one</categorie>
               <intrant>String</intrant>
            </item>
         </items>
      </purchases>
   </records>
   <records type="two">
      <purchases>
         <items>
            <item>
               <categorie>two</categorie>
               <intrant>String</intrant>
            </item>
            <item>
               <categorie>two</categorie>
               <intrant>String</intrant>
            </item>
         </items>
      </purchases>
   </records>
   <exchange/>
   <context/>
   <pilotage/>
</datafeed>

Примечание:

  1. Использование и переопределение правила идентификации .

  2. Как элементы категории "два" исключаются из обработки с использованием пустого шаблона, соответствующего им.

  3. Использование ключей для эффективного и удобного определения местоположения предметов по категориям.

2 голосов
/ 05 июля 2010

С помощью этой таблицы стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="itemsBycategorie" match="item" use="categorie"/>
    <xsl:template match="@*|node()">
        <xsl:param name="items"/>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()">
                <xsl:with-param name="items" select="$items"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="records">
        <xsl:variable name="me" select="."/>
        <xsl:for-each select="*/*/*[count(.|key('itemsBycategorie',categorie)[1])=1]">
            <records type="{categorie}">
                <xsl:apply-templates select="$me/node()">
                    <xsl:with-param name="items" select="key('itemsBycategorie',categorie)"/>
                </xsl:apply-templates>
            </records>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="items">
        <xsl:param name="items"/>
        <xsl:copy>
            <xsl:apply-templates select="$items"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Результат:

<datafeed>
    <records type="one">
        <purchases>
            <items>
                <item>
                    <categorie>one</categorie>
                    <intrant>String</intrant>
                </item>
                <item>
                    <categorie>one</categorie>
                    <intrant>String</intrant>
                </item>
            </items>
        </purchases>
    </records>
    <records type="two">
        <purchases>
            <items>
                <item>
                    <categorie>two</categorie>
                    <intrant>String</intrant>
                </item>
                <item>
                    <categorie>two</categorie>
                    <intrant>String</intrant>
                </item>
            </items>
        </purchases>
    </records>
    <exchange></exchange>
    <context></context>
    <pilotage></pilotage>
</datafeed>

Примечание : мюнхенский метод группировки.И «туннель бедняков» params (Dimitre quot).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...