XSLT - 选择两个特殊字符之间的内容

时间:2017-02-06 15:02:35

标签: regex xml xslt xslt-2.0

我有一个像这样的xml,

<doc>
    <p>text1 &lt;xml version="1.0" encoding="UTF-16"
        standalone="yes"?&gt; text2</p>
</doc>

我需要使用XSLT删除文本上方&lt; and &gt;之间的文本内容。所以期望的产出是,

<doc>
    <p>text1 text2</p>
</doc>

我尝试使用正则表达式,但我想知道如何在&lt; and &gt;格式正则表达式之间捕获文本。

知道如何使用XSLT做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这应该有效。

(&lt;(?:.?\n?)*&gt;)

然后替换为“”(空)

输入:

<doc>
    <p>text1 &lt;xml version="1.0" encoding="UTF-16"
        standalone="yes"?&gt; text2</p>
</doc>

输出:

<doc>
    <p>text1  text2</p>
</doc>

请参阅:https://regex101.com/r/0o9hol/1

答案 1 :(得分:1)

只使用XSLT-1.0,您可以通过应用以下模板来实现:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="p"> 
    <xsl:value-of select="concat(normalize-space(substring-before(text(), '&lt;')),' ',normalize-space(substring-after(text(), '&gt;')))" />
  </xsl:template>

  <!-- identity template -->
  <xsl:template match="node()|@*"> 
    <xsl:copy> 
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy> 
  </xsl:template>

</xsl:stylesheet>

此模板仅使用身份模板复制所有节点,并对所有<p>元素应用特殊处理。

<p>节点的特殊处理在text()之前和&lt;之后提取&gt;节点,同时规范化space字符的出现(将其数量减少到一)并连接结果。

就是这样。