【问题标题】:XSLT - Select content between two special charactersXSLT - 在两个特殊字符之间选择内容
【发布时间】:2017-02-06 15:02:34
【问题描述】:

我有一个这样的xml,

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

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

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

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

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

【问题讨论】:

    标签: regex xml xslt 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

    【讨论】:

      【解决方案2】:

      仅使用 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>
      

      此模板仅复制具有 身份模板 的所有节点,并对所有 &lt;p&gt; 元素应用特殊处理。

      &lt;p&gt; 节点的特殊处理提取了&amp;lt; 之前和&amp;gt; 之后的text() 节点,同时规范化space 字符的出现(将它们的计数减少到1)并连接结果。

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 2012-12-11
        • 1970-01-01
        • 2013-03-16
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多