xslt 2.0 替换为 xml-结构

xslt 2.0 replace with xml-structure

我正在使用 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+(.*)', </content><content>"/>

感谢 我能够解决这个问题。 我不得不做一些调整,但确实有效。

解决方法如下:

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

感谢迈克尔的宝贵建议!

AFAIK,你想做简化:

<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