xslt 2.0 替换为 xml 结构

Posted

技术标签:

【中文标题】xslt 2.0 替换为 xml 结构【英文标题】:xslt 2.0 replace with xml-structure 【发布时间】:2021-11-09 13:34:03 【问题描述】:

我正在使用 xslt 2.0 和替换功能。我的任务是用结构替换字符串的一部分。 示例

输入:

<xml>
<content>Title 1: This will be on a new line</content>
</xml>

输出:

<xml>
<content>Title 1:</content><content>This will be on a new line</content>
</xml>

根据 xslt 2.0,我不允许在替换字符串中有 。 如果我使用 也正在输出......

我正在使用的 xslt 是这样的:

<xsl:value-of select="replace(., '(.*)\s+(.*)', $1</content><content>$2"/>

【问题讨论】:

这是xsl:analyze-string 的任务,而不是replace() 谢谢,迈克尔。我在下面写了我的解决方案。试图以某种方式引用你,但它似乎没有正确地做到这一点......再次:非常感谢你指出我的方向的建议。 【参考方案1】:

AFAICT,你想做的很简单:

<xsl:template match="content">
    <xsl:analyze-string select="." regex="^\D*\d+:\s+">
        <xsl:matching-substring>
            <content>
                <xsl:value-of select="normalize-space(.)"/>
            </content>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <content>
                <xsl:value-of select="."/>
            </content>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

演示:https://xsltfiddle.liberty-development.net/nbiE1b5/1

【讨论】:

请参阅下面关于我的解决方案的评论。虽然不完美,但它确实解决了我的问题,这要感谢你关于使用分析字符串而不是替换的建议。【参考方案2】:

感谢comment from michael-hor257k 我能够解决这个问题。 我不得不做一些调整,但它确实奏效了。

解决办法如下:

<xsl:analyze-string select="." regex="(.*)(\d+)\s+(.*)">
            <xsl:matching-substring>
                <xsl:value-of select="regex-group(1)"/>
                <xsl:text> </xsl:text>
                <xsl:value-of select="regex-group(2)"/>
                <xsl:call-template name="ELEMENT_CONTENT_END"/>
                <xsl:call-template name="ELEMENT_BR"/>
                <xsl:call-template name="ELEMENT_CONTENT_START"/>
                    <xsl:value-of select="regex-group(3)"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="normalize-space(.)"/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>

ELEMENT_CONTENT_START 和 ELEMENT_CONTENT_START 定义如下:

<xsl:template name="ELEMENT_CONTENT_END">
        <xsl:text disable-output-escaping="yes">&lt;/content&gt;&#10;</xsl:text>
    </xsl:template>

<xsl:template name="ELEMENT_CONTENT_START">
        <xsl:text disable-output-escaping="yes">&lt;content&gt;&#10;</xsl:text>
    </xsl:template>

感谢迈克尔的宝贵建议!

【讨论】:

不,不,不!不要使用转义文本来创建标记!直接使用文字结果元素创建必要的元素。 在正常情况下,我会按照您的建议进行操作(这就是为什么我将其标记为正确答案的原因。不幸的是,我继承了一个相当复杂的系统,因此我必须发挥创造力。我提供的示例并不像我正在处理的示例那么复杂。您可能还会看到它从关闭一个元素开始,然后再开始一个新元素。

以上是关于xslt 2.0 替换为 xml 结构的主要内容,如果未能解决你的问题,请参考以下文章

用 XSLT 替换 XML 属性中的换行符

XSLT 2.0 - 如何用字符串替换'('和')'来清空?

如何使用 XSLT 2.0 将 csv 文件转换为结构化 XML 文件?

如何使用 XSLT 替换命名空间中的元素?

用XSLT替换xml中的break元素

如何使用 XSLT 替换 XML 节点名称中的字符 - 更改根元素