Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在XSLT中匹配文本和其他节点_Regex_Xslt 2.0 - Fatal编程技术网

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

Regex 如何在XSLT中匹配文本和其他节点,regex,xslt-2.0,Regex,Xslt 2.0,我正在寻找一种方法来提取节点并将其复制到输出中的不同位置。我希望使用xsl:analyze string实现这一点,但未能实现,因为如果选择是一个节点集合(例如,一个文本节点,后跟一个元素,后跟一个文本节点),则xsl:analyze string的select表达式不起作用。它仅在我将输入修改为只有一个文本节点时才起作用。但我的输入是下面的条目[2],它不仅仅是文本。即使我选择条目[2]/p,文本中也有XML标记,它们是文本之外的元素节点。下面是输入XML: <rows>

我正在寻找一种方法来提取节点并将其复制到输出中的不同位置。我希望使用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>

ID ID值

日期

sObject myObj

IdValue参数提供了幽默感

date参数指定此语言的年轻程度

myObj参数指定时间的黑暗程度。

下面是所需的输出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>

IdValue
IdValue参数提供了幽默感。
日期
date参数指定此语言的年轻程度。
myObj
myObj参数指定时间的黑暗。

对于条目[1]中找到的每个varname,如何在条目[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>

IdValue
IdValue参数提供了幽默感。
日期
date参数指定此语言的年轻程度。
myObj
myObj参数指定时间的黑暗。

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

我应该补充一点,条目[2]中的内容可以包含非varname描述的额外文本。例如:它可以是一些随机文本。

IdValue参数提供了幽默。

更多不是可变描述的文本。

谢谢您的回答。是的,这个解决方案可以工作(通过varname元素进行匹配,而不必匹配文本中的正则表达式模式)。我用了类似的东西。谢谢