使用XSLT 2将元素从一个位置移动到另一个位置

巴拉

使用XSLT 2(saxon8)将元素从一个位置移动到另一个位置

大家好,请帮助我使用XSLT 2.0产生以下输出。

我有这个:

<UL>
 <ITEM>
    aaa 
    <NL>iii
        <ITEM1>111</ITEM1>
        <ITEM2>222</ITEM2>
    </NL>
 </ITEM>
 <ITEM>
    bbb
    <NL>vvv
        <ITEM1>333</ITEM1>
        <ITEM2>444</ITEM2>
    </NL>
 </ITEM> 
</UL>

我需要生产这个

<UL>
 <ITEM>
    aaa
    <ITEM1>111</ITEM1>
 </ITEM>
 <ITEM>
    bbb
    <ITEM1>333</ITEM1>
 </ITEM>
 <NEW>
  <NL>iii
   <ITEM2>222</ITEM2>
  </NL> 
  <NL>vvv
   <ITEM2>444</ITEM2>
  </NL>
 </NEW>
</UL>

我正在尝试使用mode选项获取输出,如下所述:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="NL"/>
    <xsl:template match="ITEM2"/>

    <xsl:template match="UL">
      <xsl:copy>
    <xsl:apply-templates/>
    <NEW>
      <xsl:apply-templates select="descendant::NL" mode="move"/>
    </NEW>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="ITEM" mode="move">
        <xsl:copy>
            <xsl:apply-templates/>
        <xsl:apply-templates select="descendant::ITEM2" mode="move1"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="NL" mode="move">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="ITEM2" mode="move1">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet> 

谢谢并恭祝安康

巴拉

马丁·霍恩(Martin Honnen)

这是一个XSLT 2.0样式表,它创建了所需的结构,尽管空格有所不同,因为混合内容会产生精确的输出,这是一个问题:

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

    <xsl:template match="UL">
        <xsl:copy>
            <xsl:for-each-group select="ITEM" group-by="NL/*/node-name(.)">
                <xsl:choose>
                    <xsl:when test="position() eq 1">
                        <xsl:for-each select="current-group()">
                            <ITEM>
                                <xsl:apply-templates select="text() | NL/*[node-name(.) eq current-grouping-key()]"/>
                            </ITEM>
                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise>
                        <NEW>
                            <xsl:for-each select="current-group()">
                                <NL>
                                    <xsl:apply-templates select="NL/(text() | *[node-name(.) eq current-grouping-key()])"/>
                                </NL>
                            </xsl:for-each>
                        </NEW>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="NL/*">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我得到结果

<UL><ITEM>
        aaa 
        <ITEM1>111</ITEM1>
    </ITEM><ITEM>
        bbb
        <ITEM1>333</ITEM1>
    </ITEM><NEW><NL>iii

            <ITEM2>222</ITEM2>
        </NL><NL>vvv

            <ITEM2>444</ITEM2>
        </NL></NEW></UL>

当我添加指令以从输入中去除空格并缩进输出时,如下所示

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

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

    <xsl:template match="UL">
        <xsl:copy>
            <xsl:for-each-group select="ITEM" group-by="NL/*/node-name(.)">
                <xsl:choose>
                    <xsl:when test="position() eq 1">
                        <xsl:for-each select="current-group()">
                            <ITEM>
                                <xsl:apply-templates select="text() | NL/*[node-name(.) eq current-grouping-key()]"/>
                            </ITEM>
                        </xsl:for-each>
                    </xsl:when>
                    <xsl:otherwise>
                        <NEW>
                            <xsl:for-each select="current-group()">
                                <NL>
                                    <xsl:apply-templates select="NL/(text() | *[node-name(.) eq current-grouping-key()])"/>
                                </NL>
                            </xsl:for-each>
                        </NEW>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="NL/*">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

结果是

<UL>
   <ITEM>
        aaa 
        <ITEM1>111</ITEM1>
   </ITEM>
   <ITEM>
        bbb
        <ITEM1>333</ITEM1>
   </ITEM>
   <NEW>
      <NL>iii
            <ITEM2>222</ITEM2>
      </NL>
      <NL>vvv
            <ITEM2>444</ITEM2>
      </NL>
   </NEW>
</UL>

作为替代方案,如果我们知道存在ITEM1并且ITEM2想要拆分,那么这里是使用模式的样式表:

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

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

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

    <xsl:template match="NL">
        <xsl:apply-templates select="ITEM1"/>
    </xsl:template>

    <xsl:template match="ITEM2"/>

    <xsl:template match="UL">
        <xsl:copy>
            <xsl:apply-templates/>
            <NEW>
                <xsl:apply-templates select="descendant::NL" mode="move"/>
            </NEW>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ITEM1" mode="move"/>

</xsl:stylesheet> 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用bash命令将一组目录从一个位置移动到另一个位置

XSLT 将节点从搜索位置移动到另一个位置

如何使用sed将线段移动到另一个位置?

使用jQuery将元素移动/复制到另一个位置

使用 MapView 快速从一个位置到另一个位置的方向

使用批处理文件将zip文件夹从一个位置移动到另一位置

VBA 使用 SHFileOperation 将较新的文件从一个位置复制到另一个位置

使用XSLT将XML中的Node复制到另一个位置

如何使用 Python/regex 将字符串的一部分移动到字符串中的另一个位置

使用符号链接在Linux中将文件从一个位置移动到另一位置

使用 xslt 将 XML 元素从其位置移动到另一个父元素下

如何使用C ++程序快速将文件从一个位置复制到另一个位置?

使用.bat将文件复制到另一个位置

将 XAML 元素从一个位置移动到另一个位置

如何使用mongoose在MongoDB中将元素从一个数组位置移动到另一个数组位置?

如何使用java将一个文件传输到另一个位置

R-如何将文件从一个位置复制并粘贴到s3存储桶中的另一个位置(使用aws.s3)?

使用Powershell使用变量将文件从一个位置复制到多个位置

使用JQuery将列表元素从一个无序列表移动到另一个

将数组元素从一个数组位置移动到另一个位置

使用javascript在dom树中将元素上下移动一个位置

将切片项目从一个位置移动到另一个位置

将整行从一个位置移动到另一个位置

使用 VBA 将多个图像移动到另一个工作表 - 新位置

使用另一个位置pandas df改变pandas DF

Powershell或C#:使用CSV数据将文件从一个位置复制到另一位置

使用groovy脚本将整个目录从一个位置复制到另一位置

使用输入文件将文件从一个位置复制并重命名到另一位置

有条件将数组元素从一个位置移动到另一个位置