如何匹配XSLT中的文本和其他节点

时间:2013-06-20 18:38:43

标签: regex xslt-2.0

我正在寻找一种方法来提取节点并将其复制到输出中的其他位置。我希望用xsl:analyze-string来做这个,但是因为选择是节点的集合(例如,文本节点,后跟的xsl:analyze-string的select表达式)不起作用一个元素,后跟一个文本节点。)只有在我将输入修改为只有一个文本节点时才有效。但我的输入是下面的条目[2],这不仅仅是文本。即使我选择条目[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>

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

1 个答案:

答案 0 :(得分:1)

我能想到的最简单的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函数。