尝试使用follow-sibling进行转换

时间:2016-01-28 10:36:28

标签: xslt

我尝试通过xslt-script将旧的html转换为我的新xml结构。 我有一个问题是将下面的源转换为我需要的xml结构。

来源

$scope.language = window.localStorage['storageVariableName'];

xml结构

<p>
  <a class="DropDown">Example Text</a>
</p>
<div class="collapsed">
  <table>..</table>
  <p>..</p>
</div>

我尝试了以下xls,但是div class =“collapsed”未被lp标记采用。

<lq>
  <p>Example Text</p>
  <table>..</table>
  <p>..</p>
</lp>

任何人都可以告诉我错误的地方我错了什么?

非常感谢

1 个答案:

答案 0 :(得分:2)

恕我直言,你想这样做:

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

<xsl:template match="p[a/@class='DropDown']">
    <lp>
        <p>
            <xsl:value-of select="a"/>
        </p>
        <xsl:copy-of select="following-sibling::*[1][self::div]/node()"/>
    </lp>
</xsl:template>

<xsl:template match="div[preceding-sibling::*[1][self::p/a/@class='DropDown']]"/>

至于你的错误:

  1. 您正在测试某些 p是否存在的根元素 包含a,其后续兄弟是div。在给定的例子中,这些都不是真的;

  2. xsl:if不会更改上下文:您的<xsl:apply-templates select="*|text()"/>将模板应用于子节点 当前a;

  3. 据推测,您不希望div再次出现在原始位置 - 因此,如果您有另一个模板来禁止它,则无法使用 <xsl:apply-templates>将其插入您想要的地方 - 至少没有使用其他模式。