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"></content> </xsl:text>
</xsl:template>
<xsl:template name="ELEMENT_CONTENT_START">
<xsl:text disable-output-escaping="yes"><content> </xsl:text>
</xsl:template>
感谢迈克尔的宝贵建议!
【讨论】:
不,不,不!不要使用转义文本来创建标记!直接使用文字结果元素创建必要的元素。 在正常情况下,我会按照您的建议进行操作(这就是为什么我将其标记为正确答案的原因。不幸的是,我继承了一个相当复杂的系统,因此我必须发挥创造力。我提供的示例并不像我正在处理的示例那么复杂。您可能还会看到它从关闭一个元素开始,然后再开始一个新元素。以上是关于xslt 2.0 替换为 xml 结构的主要内容,如果未能解决你的问题,请参考以下文章
XSLT 2.0 - 如何用字符串替换'('和')'来清空?