首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT复制相同的兄弟姐妹,直到其他兄弟出现。

XSLT复制相同的兄弟姐妹,直到其他兄弟出现。
EN

Stack Overflow用户
提问于 2016-08-05 13:54:42
回答 1查看 423关注 0票数 0

嗨,

我正在尝试使用XSLT1.0转换以下列表:

代码语言:javascript
复制
<div data-class="a"/>
<div data-class="b"/>
<div data-class="b"/>
<div data-class="c"/>
<div data-class="b"/>
<div data-class="a"/>
<div data-class="b"/>
<div data-class="c"/>
<div data-class="d"/>
<div data-class="a"/>
<div data-class="a"/>

它应按以下方式转换数据:

代码语言:javascript
复制
<div data-class="a">
    <div data-class="b"/>
    <div data-class="b">
        <div data-class="c"/>
    </div>
    <div data-class="b"/>
</div>
<div data-class="a">
    <div data-class="b">
        <div data-class="c">
            <div data-class="d"/>
        </div>
    </div>
</div>
<div data-class="a"/>
<div data-class="a"/>
    <div data-class="b">
        <div data-class="c"/>
        <div data-class="c"/>
    </div>
</div>

我从几个小时开始就试着把它正确地改造一下。为了转换它,我使用了复制标记:

代码语言:javascript
复制
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*" />
  </xsl:copy>
</xsl:template>

<xsl:template match="div[@data-class='a']">
  <xsl:copy>
    <xsl:apply-templates select="node() | @* | following-sibling::div[@data-class='b']" />
  </xsl:copy>
</xsl:template>

<xsl:template match="div[@data-class='a']">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
    <xsl:apply-templates select="following-sibling::div[@data-class='b']" />
  </xsl:copy>
</xsl:template>

<xsl:template match="div[@dataclass='b']">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
    <xsl:apply-templates select="following-sibling::div[@data-class='c']" />
  </xsl:copy>
</xsl:template>

问题是,数据类的以下所有元素都被录取了--请帮助我。非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 14:10:50

我建议你试一试:

XSLT1.0

代码语言:javascript
复制
<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="*"/>

<xsl:key name="b" match="div[@data-class='b']" use="generate-id(preceding-sibling::div[@data-class='a'][1])" />
<xsl:key name="c" match="div[@data-class='c']" use="generate-id(preceding-sibling::div[@data-class='b'][1])" />
<xsl:key name="d" match="div[@data-class='d']" use="generate-id(preceding-sibling::div[@data-class='c'][1])" />

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

<xsl:template match="/root">
    <xsl:copy>
        <xsl:apply-templates select="div[@data-class='a']"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="div[@data-class='a']">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
        <xsl:apply-templates select="key('b', generate-id())"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="div[@data-class='b']">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
    <xsl:apply-templates select="key('c', generate-id())"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="div[@data-class='c']">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
    <xsl:apply-templates select="key('d', generate-id())"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

当将上述内容应用于以下格式良好的输入示例时:

XML

代码语言:javascript
复制
<root>
    <div data-class="a"/>
    <div data-class="b"/>
    <div data-class="b"/>
    <div data-class="c"/>
    <div data-class="b"/>
    <div data-class="a"/>
    <div data-class="b"/>
    <div data-class="c"/>
    <div data-class="d"/>
    <div data-class="a"/>
    <div data-class="a"/>
</root>

其结果将是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <div data-class="a">
      <div data-class="b"/>
      <div data-class="b">
         <div data-class="c"/>
      </div>
      <div data-class="b"/>
   </div>
   <div data-class="a">
      <div data-class="b">
         <div data-class="c">
            <div data-class="d"/>
         </div>
      </div>
   </div>
   <div data-class="a"/>
   <div data-class="a"/>
</root>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38791024

复制
相关文章

相似问题

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