1

我正在寻找一种方法来提取节点并将其复制到输出中的不同位置。我希望使用 xsl:analyze-string 执行此操作,但由于 xsl:analyze-string 的选择表达式不起作用,如果选择是节点集合(例如,文本节点,后跟一个元素,后跟一个文本节点。)它仅在我将输入修改为只有一个文本节点时才起作用。但我的输入是下面的 entry[2],而不仅仅是文本。即使我选择了entry[2]/p,文本中也有XML标签,它们是除了文本之外的元素节点。所以这里是输入 XML:

<rows>
    <row>
        <entry>
            <p>ID <varname>IdValue</varname></p>
            <p>Date <varname>date</varname></p>
            <p>sObject <varname>myObj</varname></p>
        </entry>
        <entry>
            <p>The <varname>IdValue</varname> argument provides humor.</p>
            <p>The <varname>date</varname> argument specifies how young this language is.</p>
            <p>The <varname>myObj</varname> argument specifies the darkness of times.</p>    
        </entry>   
    </row>
</rows>

这是所需的输出 XML:

<section>
    <parameters>
        <param>
            <pn><varname>IdValue</varname></pn>
            <pv>The <varname>IdValue</varname> argument provides humor.</pv>
        </param>
        <param>
            <pn><varname>date</varname></pn>
            <pv>The <varname>date</varname> argument specifies how young this language is.</pv>
        </param>
        <param>
            <pn><varname>myObj</varname></pn>
            <pv>The <varname>myObj</varname> argument specifies the darkness of times.</pv>
        </param>
    </parameters>
</section>

对于在 entry[1] 中找到的每个 varname,如何在 entry[2] 中找到匹配的描述?

4

1 回答 1

2

我能想到的最简单的 XSLT 解决方案是这样的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="rows">
    <section>
      <xsl:apply-templates select="row" />
    </section>
  </xsl:template>

  <xsl:template match="row">
    <parameters>
      <xsl:apply-templates select="entry[1]/p/varname" />
    </parameters>
  </xsl:template>

  <xsl:template match="entry[1]/p/varname">
    <param>
      <pn>
        <xsl:copy-of select="." />
      </pn>
      <pv>
        <xsl:copy-of select="ancestor::row/entry[2]//p[varname = current()]/node()" />
      </pv>
    </param>
  </xsl:template>
</xsl:stylesheet>

并生产

<section>
  <parameters>
    <param>
      <pn><varname>IdValue</varname></pn>
      <pv>The <varname>IdValue</varname> argument provides humor.</pv>
    </param>
    <param>
      <pn><varname>date</varname></pn>
      <pv>The <varname>date</varname> argument specifies how young this language is.</pv>
    </param>
    <param>
      <pn><varname>myObj</varname></pn>
      <pv>The <varname>myObj</varname> argument specifies the darkness of times.</pv>
    </param>
  </parameters>
</section>

注意current()XSLT 函数的使用。

于 2013-06-20T22:10:06.157 回答