Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
Xml 如何在选定属性上使用fn:replace?_Xml_Regex_Xslt_Xpath - Fatal编程技术网

Xml 如何在选定属性上使用fn:replace?

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 我找到了,但不知道如何使用它 有什么想法吗

我没有使用xslt的经验,但我正试图通过调整一些代码来学习

在XML中,我多次出现不同的
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>