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