gpt4 book ai didi

xml - 如何在所选属性上使用fn:replace?

转载 作者:行者123 更新时间:2023-12-03 17:03:56 25 4
gpt4 key购买 nike

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

在XML中,我多次出现不同的idrid,如下所示:

<fn id="TFN01t1"><label>*</label><p>Some text.</p></fn>
<fn id="TFN02t1"><label>**</label><p>Some text.</p></fn>
...
<p>This is a reference<xref ref-type="table-fn" rid="TFN01t1">*</xref></p>
<p>This is another reference<xref ref-type="table-fn" rid="TFN02t1">*</xref></p>


我需要在fn标签的ID属性和任何外部参照标签的RID属性中执行以下正则表达式,并交换数字部分,以使TFN02t1变为TFN1t02。

        "find": TFN([0-9]+)t([1-9]+)
"replace": TFN\2t\1


我找到了 this SO answer about fn:replace,但不知道如何使用它。

有任何想法吗?

最佳答案

如果您可以不使用正则表达式而生活,那么还可以使用这种简单的XSLT1兼容解决方案:

输入项

<root>
<fn id="TFN01t1"><label>*</label><p>Some text.</p></fn>
<fn id="TFN02t1"><label>**</label><p>Some text.</p></fn>
<p>This is a reference<xref ref-type="table-fn" rid="TFN01t1">*</xref></p>
<p>This is another reference<xref ref-type="table-fn" rid="TFN02t1">*</xref></p>
</root>


样式表

<xsl:stylesheet version="1.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[@ref-type = 'table']/@rid">
<xsl:variable name="after-tfn" select="substring-after(., 'TFN')"/>
<xsl:variable name="n1" select="substring-before($after-tfn, 't')"/>
<xsl:variable name="n2" select="substring-after($after-tfn, 't')"/>

<xsl:attribute name="{local-name()}">
<xsl:value-of select="concat('TFN', $n2, 't', $n1)"/>
</xsl:attribute>
</xsl:template>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


输出量

<?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>


如果可以使用XSLT2并希望使用正则表达式,则此样式表应达到相同的结果:

样式表

<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>


有关XSLT2中正则表达式支持的更多信息,请参见 Regular Expression Matching in XSLT 2

关于xml - 如何在所选属性上使用fn:replace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24737335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com