1

鉴于此 XML,我需要使用正确的 @relatedId 填充“标志端”元素,以便我可以使用 xsl:iterate 从标志中重新创建元素。我知道如何创建元素,但我不知道如何在每个标志端正确填充 @associatedId。(由于我们使用的第三方软件,这是必要的。我总是保证相同数量的开始和结束标志,并且适当数量的结束标志将遵循适当数量的开始标志。)

    <outer>
        hello
        <flag-start associatedId="test3"/>
        <flag-start associatedId="test"/>
        <span>wor<b>---</b>ld</span>
        <flag-start associatedId="test4"/>
        <flag-end/>
        <flag-start associatedId="test2"/>
        <flag-end/>
        <flag-end/>
        <flag-end/>
        <flag-start associatedId="test5"/>
        <flag-end/>
        some more text
    </outer>

这是所需的 XML 输出:

    <outer>
        hello
        <flag-start associatedId="test3"/>
        <flag-start associatedId="test"/>
        <span>wor<b>---</b>ld</span>
        <flag-start associatedId="test4"/>
        <flag-end associatedId="test4"/>
        <flag-start associatedId="test2"/>
        <flag-end associatedId="test2"/>
        <flag-end associatedId="test"/>
        <flag-end associatedId="test3"/>
        <flag-start associatedId="test5"/>
        <flag-end associatedId="test5"/>
        some more text
    </outer>
4

1 回答 1

1

像这样的东西:

<xsl:iterate select="*">
  <xsl:param name="stack" select="()"/>
  <xsl:choose>
    <xsl:when test="self::flag-start">
      <xsl:copy-of select="."/>
      <xsl:next-iteration>
        <xsl:with-param name="stack" select="@associatedID, $stack"/>
      </xsl:next-iteration>
    </xsl:when>
    <xsl:when test="self::flag-end">
      <xsl:copy>
        <xsl:attribute name="associatedId" select="head($stack)"/>
      </xsl:copy>
      <xsl:next-iteration>
        <xsl:with-param name="stack" select="tail($stack)"/>
      </xsl:next-iteration>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="."/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:iterate>

未测试。假设可以相信数据是可靠的。

于 2016-10-06T15:17:46.190 回答