Xml 如何在选定属性上使用fn:replace?
我没有使用xslt的经验,但我正试图通过调整一些代码来学习 在XML中,我多次出现不同的Xml 如何在选定属性上使用fn:replace?,xml,regex,xslt,xpath,Xml,Regex,Xslt,Xpath,我没有使用xslt的经验,但我正试图通过调整一些代码来学习 在XML中,我多次出现不同的id和rid,如下所示: *一些文本 ** 一些文本 ... 这是一个参考* 这是另一个参考* 我需要在fn标记的ID属性中执行以下正则表达式,在任何外部参照标记的RID属性中执行,并交换数字部分,以便TFN02t1变为TFN1t02 "find": TFN([0-9]+)t([1-9]+) "replace": TFN\2t\1 我找到了,但不知道如何使用它 有什么想法吗
id
和rid
,如下所示:
*一些文本
** 一些文本
...
这是一个参考*
这是另一个参考*
我需要在fn标记的ID属性中执行以下正则表达式,在任何外部参照标记的RID属性中执行,并交换数字部分,以便TFN02t1变为TFN1t02
"find": TFN([0-9]+)t([1-9]+)
"replace": TFN\2t\1
我找到了,但不知道如何使用它
有什么想法吗?如果您可以不使用正则表达式,也可以使用这个简单的XSLT1兼容解决方案: 输入
* 一些文本
** 一些文本
这是一个参考*
这是另一个参考*
样式表
输出
* 一些文本
** 一些文本
这是一个参考*
这是另一个参考*
如果您可以使用XSLT2并希望使用正则表达式,则此样式表应获得相同的结果:
样式表
有关XSLT2中正则表达式支持的更多信息,请参阅。如果您可以不使用正则表达式,也可以使用此简单的XSLT1兼容解决方案: 输入
* 一些文本
** 一些文本
这是一个参考*
这是另一个参考*
样式表
输出
* 一些文本
** 一些文本
这是一个参考*
这是另一个参考*
如果您可以使用XSLT2并希望使用正则表达式,则此样式表应获得相同的结果:
样式表
有关XSLT2中正则表达式支持的更多信息,请参阅。如果您试图通过调整现有代码来实现这一点,那么在无法查看现有代码的情况下很难提供帮助 例如,您需要一个匹配相关节点的模板规则
<xsl:template match="fn/@id | xref/@rid">
<xsl:attribute name="{name()}" select="replace('.', 'TFN([0-9]+)t([1-9]+)',
'TFN$2t$1')"/>
</xsl:template>
然后,您需要确保样式表中的某个地方有一个对xsl:apply templates的调用,该调用选择这些属性节点进行处理,因为没有它,您的模板规则将永远不会被调用。如果您试图通过调整现有代码来实现这一点,如果看不到现有的代码,就有点难帮助您 例如,您需要一个匹配相关节点的模板规则
<xsl:template match="fn/@id | xref/@rid">
<xsl:attribute name="{name()}" select="replace('.', 'TFN([0-9]+)t([1-9]+)',
'TFN$2t$1')"/>
</xsl:template>
然后,您需要确保样式表中的某个地方有一个对xsl:apply templates的调用,该调用选择这些属性节点进行处理,因为没有它,您的模板规则将永远不会被调用。谢谢!这正是我想要的。然而,我刚刚意识到我的处理器版本为1,因此很遗憾,我无法尝试它…:-(我将尝试另一个答案的版本1,但将其标记为书签,因为我是regex的粉丝。我希望我可以。谢谢!谢谢!这正是我想要的。但是我刚刚意识到我的处理器是版本1,因此很遗憾我无法尝试它…:-(我将尝试另一个答案的第1版,但将此添加为书签,因为我是regex的粉丝。希望我可以。谢谢!
<?xml version="1.0" encoding="utf-8"?>
<root>
<fn id="TFN1t01"><label>*</label><p>Some text.</p></fn>
<fn id="TFN1t02"><label>**</label><p>Some text.</p></fn>
<p>This is a reference<xref ref-type="table-fn" rid="TFN1t01">*</xref></p>
<p>This is another reference<xref ref-type="table-fn" rid="TFN1t02">*</xref></p>
</root>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8"/>
<xsl:template match="fn/@id | xref/@rid">
<xsl:attribute name="{local-name(.)}">
<xsl:analyze-string select="." regex="TFN([0-9]+)t([1-9]+)">
<xsl:matching-substring>
<xsl:value-of select="concat('TFN', regex-group(2), 't', regex-group(1))"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:attribute>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="fn/@id | xref/@rid">
<xsl:attribute name="{name()}" select="replace('.', 'TFN([0-9]+)t([1-9]+)',
'TFN$2t$1')"/>
</xsl:template>