XSLT将char替换为元素

XSLT将char替换为元素,xslt,replace,Xslt,Replace,我试图用一个元素(包含更多元素)替换单个字符。 使用XSL2.0 例如: <element1> <element2>some text and the char - I want to replace </element2> ... </element1> 一些文本和字符-我想替换 ... 现在应使用新元素替换-(破折号): <element1> <element2>some text and

我试图用一个元素(包含更多元素)替换单个字符。 使用XSL2.0

例如:

<element1>
    <element2>some text and the char - I want to replace </element2>
    ...
</element1>

一些文本和字符-我想替换
...
现在应使用新元素替换-(破折号):

<element1>
    <element2>some text and the char <newElement/> I want to replace </element2>
    ...
</element1>

一些文本和我要替换的字符
...
我已经试过了:

<xsl:template match="element1">
    <xsl:analyze-string select="." regex="-">
        <xsl:matching-substring>
            <newElement/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
 </xsl:template>

但这会删除中间的所有其他元素(因为只“返回”字符串)


使用函数replace(),您只能插入字符串(无您的模板匹配
元素()
,但替换
文本()
。如果您在复制其余内容时匹配
文本()
并替换
文本()
,它将按预期工作:

<!-- modified identity template matching no text() nodes -->
<xsl:template match="element() | comment() | processing-instruction()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" />
  </xsl:copy>
</xsl:template>

<xsl:template match="text()">
  <xsl:analyze-string select="." regex="-">
    <xsl:matching-substring>
        <newElement/>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
        <xsl:copy-of select="."/>
    </xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

需要两个更正:

  • 您的模板应该匹配
    element2
    ,而不是
    element1
  • 在tempate的开头和结尾,您应该添加
    元素2的开始/结束标记(类似于
    标识模板)
因此,您的模板应如下所示:

<xsl:template match="element2">
  <element2>
    <xsl:analyze-string select="." regex="-">
      <xsl:matching-substring>
        <newElement/>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </element2>
 </xsl:template>


当然,您的脚本还应该包括标识模板。

匹配angaist text()完成了此操作。现在的问题是,此匹配不适用于子节点的文本。它使用
子节点或self::text()进行了尝试
但没有成功。问题是由另一个模板匹配引起的,该模板匹配重命名元素并复制其文本……有没有任何想法如何始终强制匹配?因为这不是示例的一部分,很难判断。我测试了XML
一些我喜欢的文本-它!和字符-我想替换的
,结果与预期一致。“修改的标识模板”也不包括
text()
节点。也许这对你来说是一个灵感。否则,我想最好创建一个新问题,并举例说明确切的问题是什么。