删除编码的HTML并添加线路断路



我一直在尝试解决这个问题数小时,但没有运气。XML看起来像 -

    <description>
     Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
    sed diam nonumy eirmod tempor labore et dolore magna aliquyam erat
     &lt;p&gt;&lt;b&gt;Section B: China&lt;/b&gt;&lt;/p&gt;
     &lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
     sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
     eratLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
     eirmod tempor invidunt ut labore et dolore magna aliquyam erat&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;Section C: Himalayan Studies&lt;/b&gt;&lt;/p&gt;
     &lt;p&gt;Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
     sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
     eratLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
     nonumy eirmod tempor invidunt ut labore a aliquyam erat&lt;/p&gt;
     </description>

我希望没有编码的<p><b>标签的输出清洁,但也可以通过用<br/>替换&lt;p&gt;&lt;b&gt;之前在截面前插入插头。因此,输出看起来像

<description>
       Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
       sed diam nonumy eirmod tempor labore et dolore magna aliquyam erat
       <br/>Section B: Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
       sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
       eratLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam no
       eirmod tempor invidunt ut labore et dolore magna aliquyam erat
        <br/>Section C: Himalayan Studies Lorem ipsum dolor sit amet, consetetur 
       sadipscing sed diam nonumy eirmod tempor invidunt ut labore et dolore m   
       ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
       nonumy eirmod tempor invidunt ut labore a aliquyam erat
         </description>

我尝试使用替换功能,但无法添加线路断路。也尝试使用翻译,但没有运气

<xsl:value-of select="translate(.,
            translate(.,
            'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ',
            ''),
            '')"/>

关于如何解决此问题的任何帮助。

AN XSLT 3.0 使用 parse-xml()函数:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <!--standard identity template-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="description">
        <xsl:copy>
            <!--Concatenate encoded <p> element to ensure that it is well-formed 
                XML with a document element when parsed.
                Use parse-xml() to parse the encoded markup as a parsed document.
                Apply-templates to the parsed document--> 
            <xsl:apply-templates select="parse-xml(concat('&lt;p&gt;', ., '&lt;/p&gt;'))"/>
        </xsl:copy>
    </xsl:template>
    <!-- remove <p> and <b> elements -->
    <xsl:template match="p | b">
        <xsl:apply-templates/>
    </xsl:template>
    <!--for every <p> element that has a <b> element, generate a <br/> -->
    <xsl:template match="p[b]">
        <br/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

一个不高的(但是工作)解决方案:

<xsl:value-of select="replace(replace(replace(., 
                     '&lt;p&gt;&lt;b&gt;', '¶'), 
                     '(&lt;)(.*)(&gt;)', ''), 
                     '¶', '&lt;br/&gt;')" 
              disable-output-escaping="yes"/>

替代方案(这更丑)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="description/text()">
        <description>
            <xsl:analyze-string select="." regex="&lt;p&gt;&lt;b&gt;">
                <xsl:matching-substring>
                    <br/>
                </xsl:matching-substring>
                <xsl:non-matching-substring>
                    <xsl:analyze-string select="." regex="&lt;/b&gt;&lt;/p&gt;">
                        <xsl:matching-substring/>
                        <xsl:non-matching-substring>
                            <xsl:analyze-string select="." regex="&lt;p&gt;">
                                <xsl:matching-substring/>
                                <xsl:non-matching-substring>
                                    <xsl:analyze-string select="." regex="&lt;/p&gt;">
                                        <xsl:matching-substring/>
                                        <xsl:non-matching-substring>
                                            <xsl:value-of select="."/>
                                        </xsl:non-matching-substring>
                                    </xsl:analyze-string>
                                </xsl:non-matching-substring>
                            </xsl:analyze-string>
                        </xsl:non-matching-substring>
                    </xsl:analyze-string>
                </xsl:non-matching-substring>
            </xsl:analyze-string>
        </description>
    </xsl:template>
</xsl:stylesheet>

AN XSLT 2.0 解决方案,该解决方案使用 tokenize() 函数将发生&lt;p&gt;&lt;b&gt;的编码HTML拆分。对于每个令牌化项目,它创建<br/>元素(如果不是顺序中的第一项),并使用 replace() 函数从该项目中删除其余的任何编码标记。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="description">
        <xsl:copy>
            <xsl:for-each select="tokenize(., '&lt;p&gt;&lt;b&gt;')">
                <xsl:if test="position()>1">
                    <br/>
                </xsl:if>
                <xsl:sequence select="replace(., '&lt;.*?&gt;', '')"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

最新更新