首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT 1.0拆分元素的逻辑

XSLT 1.0拆分元素的逻辑
EN

Stack Overflow用户
提问于 2014-01-14 13:31:57
回答 2查看 197关注 0票数 0

LOOP-1、2和3元素是unbounded.below,它包含所有的Loop-1元素,然后是Loop-2元素。我们如何将其转换为类似的输出xml.我在下面的xslt中尝试过,但它给出了相同的输入。

输入xml:

代码语言:javascript
复制
<root>
<LOOP-1><!-- unbounded -->
<element1>A</element1>
</LOOP-1>
<LOOP-1>
<element1>A</element1>
</LOOP-1>

<LOOP-2><!-- unbounded -->
<element2>B</element2>
</LOOP-2>

<LOOP-2>
<element2>B</element2>
</LOOP-2>

</root>

XSLT:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

<xsl:template match="/">
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

输出:

代码语言:javascript
复制
<?xml version="1.0"?>
<root>
<LOOP-1> 
<element1>A</element1>
</LOOP-1>
<LOOP-2> 
<element2>B</element2>
</LOOP-2>
<LOOP-1>
<element1> A</element1>
</LOOP-1>
<LOOP-2>
<element2>B</element2>
</LOOP-2>
</root>
EN

回答 2

Stack Overflow用户

发布于 2014-01-14 15:13:07

您可以尝试以下代码:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

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

    <xsl:template match="/root">
        <xsl:for-each select="child::LOOP-1">
            <xsl:variable name="pos" select="position()"/>
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
            <xsl:apply-templates select="following-sibling::LOOP-2[position()=$pos]"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
票数 0
EN

Stack Overflow用户

发布于 2014-01-14 16:50:35

如果你想处理任意数量的循环元素(你在第一句话中提到了1,2和3,但在你的例子中实际上没有显示3),你可以做的是定义一个键来帮助根据元素的‘数字’来查找它们。

代码语言:javascript
复制
<xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" />

然后只选择-1\f25LOOP-1\f6元件

代码语言:javascript
复制
<xsl:apply-templates select="key('loop', '1')" />

接下来,您将拥有一个share模板来匹配任何循环元素,而不考虑元素的数量

在其中,您将调用标识模板来复制元素,然后调用apply-templates来选择具有下一个编号但位置相同的循环元素:

代码语言:javascript
复制
 <xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" />

试试这个XSLT

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

  <xsl:key name="loop" match="*[starts-with(local-name(), 'LOOP')]" use="substring-after(local-name(), '-')" />

  <xsl:template match="root">
    <root>
      <xsl:apply-templates select="key('loop', '1')" />
    </root>
  </xsl:template>

  <xsl:template match="*[starts-with(local-name(), 'LOOP')]">
     <xsl:call-template name="identity" />
     <xsl:variable name="pos" select="position()" />
     <xsl:apply-templates select="key('loop', string(number(substring-after(local-name(), '-')) + 1))[$pos]" />
  </xsl:template>

  <xsl:template match="@*|node()" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21106685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档