XSLT用元素替换char

时间:2018-01-29 11:18:27

标签: xslt replace

我试图用一个元素(包含更多元素)替换单个字符。 使用XSL 2.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>

但是这删除了中间的所有其他元素(因为只有字符串是&#34;返回&#34;)。

使用 replace()功能,您只能插入字符串(不能&lt; )。

还有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您的模板与element()匹配,但会替换text()。如果您匹配text()并在复制其余内容时替换text(),则会按预期工作:

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

答案 1 :(得分:0)

需要进行两次更正:

  • 您的模板应与element2匹配,而不是element1
  • 在你的诱惑的开始和结束时你应该添加 打开/关闭element2的标签(类似于 身份模板)。

所以你的模板应该是这样的:

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

当然,您的脚本还应包含身份模板