在同一父节点下包含具有特定id的节点

时间:2017-05-15 08:23:58

标签: xslt

我想转换以下HTML代码

<div id="pg-1">
    <div id="pgc-1">
        <div class="test">Hello World!</div>
    </div>

    <div id="pgc-2">
        <div class="test">Hello World!</div>
    </div>
</div>

<div id="pg-2">
    <div id="pgc-3">
        <div class="test">Hello World!</div>
    </div>

    <div id="pgc-4">
        <div class="test">Hello World!</div>
    </div>
</div>

进入这个

<section id="pg-1">
    <div class="container">
        <div class="row">
            <div id="pgc-1">
                <div class="test">Hello World!</div>
            </div>

            <div id="pgc-2">
                <div class="test">Hello World!</div>
            </div>
        </div>
    </div>
</section>

<section id="pg-2">
    <div class="container">
        <div class="row">
            <div id="pgc-3">
                <div class="test">Hello World!</div>
            </div>

            <div id="pgc-4">
                <div class="test">Hello World!</div>
            </div>
        </div>
    </div>
</section>

我能够使这个XSLT文档正常工作:

<xsl:stylesheet version="1.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="//div[starts-with(@id, 'pgc-')]">       
      <div class="container">
            <div class="row">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
            </div>
        </div>
   </xsl:template>

   <xsl:template match="//div[starts-with(@id, 'pg-')]">
       <section>
          <xsl:apply-templates select="@*|node()" />
       </section>
   </xsl:template>
</xsl:stylesheet>

不幸的是,它并没有产生我想要的东西:特别是,它确实在容器中包含了带有pgc的元素,但它并没有将它们组合成只有一个父元素。这是现在输出的(每个部分):

<section id="pg-1">
    <div class="container">
        <div class="row">
            <div id="pgc-1">
                <div class="test">Hello World!</div>
            </div>
        </div>
    </div>

    <div class="container">
        <div class="row">
            <div id="pgc-2">
                <div class="test">Hello World!</div>
            </div>
        </div>
    </div>
</section>

作为我想做的总结:

  • id属性从pg-开始的所有元素的标记名称更改为section(我应将所有属性复制到新元素)
  • 将同一父节点id下具有pgc-属性的div以.container > .row开头的所有子元素包裹起来(我应将所有属性复制到新元素)

1 个答案:

答案 0 :(得分:1)

我猜*你想做点什么:

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="div[starts-with(@id, 'pg-')]">
    <section>
        <xsl:copy-of select="@*"/>
        <div class="container">
            <div class="row">
                <xsl:apply-templates />
            </div>
        </div>
    </section>
</xsl:template>

</xsl:stylesheet>

-
(*)只有一个(有缺陷的)例子,没有规定的规则,所有人都能猜到。