如何使用XSLT将此HTML转换为所需的文本

时间:2017-09-07 18:21:59

标签: html xml xslt

自从我使用XSLT做了一些事情以来已经过去了将近20年。尝试将此HTML代码段等文档转换为以下文本。

<p>
おばあさんは、とても
<ruby><rb>喜</rb><rp>(</rp><rt>よろこ</rt><rp>)</rp></ruby>びました。<br/>
「おじいさん、
<ruby><rb>今</rb><rp>(</rp><rt>こん</rt><rp>)</rp></ruby>
<ruby><rb>晩</rb><rp>(</rp><rt>ばん</rt><rp>)</rp></ruby>、このたぬきで、たぬき
</p>

期望的输出

おばあさんは、とても<ruby=よろこ>喜</ruby>びました。<br/>
「おじいさん、
<ruby=こん>今</ruby><ruby=ばん>晩</ruby>、このたぬきで、たぬき

我需要将很多页面的文本转换为此专有标记。

这里是我开始的,但它远没有工作,因为我正在努力处理ruby标签之外的文本。这一直是XSLT的难点吗?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/p">
    <xsl:text disable-output-escaping="yes">&lt;p&gt;</xsl:text>
            <xsl:value-of select="."/>
    <xsl:apply-templates select="ruby"/>
    <xsl:text disable-output-escaping="yes">&lt;/p&gt;</xsl:text>
</xsl:template>
<xsl:template match="ruby">

        <xsl:apply-templates select="rb"/>
        <xsl:apply-templates select="rt"/>

</xsl:template>
<xsl:template match="rb">
    <xsl:value-of select="."/>
            <xsl:text>&lt;/ruby&gt;</xsl:text>
</xsl:template>
<xsl:template match="rt">
    <xsl:text>&lt;ruby=</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&gt;</xsl:text>
</xsl:template>
</xsl:stylesheet>

更新 啊我看到故事的一部分要用priority

<xsl:template match="/p" priority="0">
    <xsl:text disable-output-escaping="yes">&lt;p&gt;</xsl:text>
       <xsl:apply-templates/>

    <xsl:apply-templates select="ruby"/>
    <xsl:text disable-output-escaping="yes">&lt;/p&gt;</xsl:text>
</xsl:template>

需要优先考虑以确保它不会在模板匹配之前得到应用&#34; ruby​​&#34;和&#34; rt&#34;例如。

1 个答案:

答案 0 :(得分:1)

解决了它

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/p" priority="0">
    <xsl:text>&lt;p&gt;</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>&lt;/p&gt;</xsl:text>
</xsl:template>
<xsl:template match="ruby">
    <xsl:text>&lt;ruby=</xsl:text>
    <xsl:apply-templates select="rt"/>
    <xsl:text>&gt;</xsl:text>
    <xsl:apply-templates select="rb"/>
    <xsl:text>&lt;/ruby&gt;</xsl:text>
</xsl:template>
<xsl:template match="rb">
    <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="rt">
    <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="br">
    <xsl:text>&lt;br/&gt;</xsl:text>
</xsl:template>
</xsl:stylesheet>