1

我一直在尝试解决这个问题几个小时,但没有运气。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>在部分之前插入换行符。所以输出看起来像&lt;p&gt;&lt;b&gt;<br/>

<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 ',
            ''),
            '')"/>

任何有关如何解决此问题的帮助将不胜感激。

4

4 回答 4

1

另一种选择(更丑陋)

<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>
于 2014-01-24T01:41:51.587 回答
1

一种XSLT 2.0解决方案,它使用该tokenize()函数在发生的位置拆分编码的 HTML &lt;p&gt;&lt;b&gt;。对于每个标记化的项目,它会创建元素(如果它不是序列中的第一个项目)并使用函数<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>
于 2014-01-24T19:56:12.853 回答
1

一个不优雅(但有效)的解决方案:

<xsl:value-of select="replace(replace(replace(., 
                     '&lt;p&gt;&lt;b&gt;', '¶'), 
                     '(&lt;)(.*)(&gt;)', ''), 
                     '¶', '&lt;br/&gt;')" 
              disable-output-escaping="yes"/>
于 2014-01-24T00:22:21.133 回答
1

使用parse-xml()函数的XSLT 3.0解决方案:

<?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>
于 2014-01-24T19:19:00.060 回答