Переименовать и переместить узел на один уровень вверх - PullRequest
0 голосов
/ 07 ноября 2019

Я бы хотел переименовать и переместить узел на один уровень вверх, если значением узла является определенное значение.

Пока я написал это:

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

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

    <xsl:template match="stock/images/image[main_image = 1]">
    <primary>
         <xsl:apply-templates />
    </primary>     
    </xsl:template>

</xsl:stylesheet>

Ввод:

<root>
<stock>
      <code>Apple</code>
      <images>
         <image>
            <img_file>1.jpg</img_file>
            <main_image>1</main_image>
         </image>
         <image>
            <img_file>2.jpg</img_file>
            <main_image>0</main_image>
         </image>
      </images>
</stock>         
</root>

Вывод:

<root>
<stock>
      <code>Apple</code>
      <images>
         <primary>
            <img_file>1.jpg</img_file>
            <main_image>1</main_image>
         </primary>
         <image>
            <img_file>2.jpg</img_file>
            <main_image>0</main_image>
         </image>
      </images>
</stock>         
</root>

Это почти хорошо, но я бы хотел переместить <primary> узел на один уровень вверх, за пределы <images>, например:

<root>
<stock>
      <code>Apple</code>
      <primary>
            <img_file>1.jpg</img_file>
            <main_image>1</main_image>
      </primary>
      <images>
         <image>
            <img_file>2.jpg</img_file>
            <main_image>0</main_image>
         </image>
      </images>
</stock>         
</root>

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Один путь будет

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="stock[images[image[main_image = 1]]]">
        <xsl:copy>
            <xsl:apply-templates select="@* | *[not(self::images)]"/>
            <xsl:apply-templates select="images/image[main_image = 1]"/>
            <xsl:apply-templates select="images"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="images">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()[not(self::image[main_image = 1])]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="stock/images/image[main_image = 1]">
        <primary>
             <xsl:apply-templates />
        </primary>     
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 08 ноября 2019

Как насчет:

XSLT 1.0

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

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

<xsl:template match="stock">
    <xsl:copy>
        <xsl:apply-templates select="code"/>
        <primary>
            <xsl:apply-templates select="images/image[main_image = 1]/*"/>
        </primary>
        <images>
            <xsl:apply-templates select="images/image[not(main_image = 1)]"/>
        </images>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Предполагается, что основное изображение всегда существует. В противном случае вам потребуется:

XSLT 1.0

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

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

<xsl:template match="stock">
    <xsl:copy>
        <xsl:apply-templates select="code"/>
        <xsl:apply-templates select="images/image[main_image = 1]" mode="primary"/>
        <images>
            <xsl:apply-templates select="images/image[not(main_image = 1)]"/>
        </images>
    </xsl:copy>
</xsl:template>

<xsl:template match="image" mode="primary">
    <primary>
        <xsl:apply-templates/>
    </primary>     
</xsl:template>

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