以正确的格式显示给定xml的节点值及其标记

时间:2018-02-23 04:53:56

标签: xslt

输入文件格式

<!DOCTYPE html>
<html>
    <body>
        <p>I am normal</p>
        <p style="color:red;">I am<b> r<i>e</i>d</b></p>
        <p style="color:blue;">I am <b>blue</b></p>
        <p><b>I am <i>big</i></b></p>        
    </body>
</html>

预期产出(取自作者的评论意见)

<sp:html xmlns:"urn:unknown">
    <sp:body>
        <sp:p>I am normal</sp:p>
        <sp:p>I am <sp:b emphasis="true">r <sp:i emphasis="true">
                    <sp:color textforecolor="red">e</sp:color>
                </sp:i>
            </sp:b>d </sp:p>
        <sp:p>I am <sp:b emphasis="true">
                <sp:color textforecolor="blue">blue</sp:color>
            </sp:b>
        </sp:p>
        <sp:p>
            <sp:b>I am<sp:span> </sp:span><sp:i>big</sp:i></sp:b>
        </sp:p>
    </sp:body>
</sp:html>

作者想知道如何将输入转换为给定的输出。

1 个答案:

答案 0 :(得分:0)

我已编辑了您的问题(将预期输出添加到其中)。

此样式表接近您在评论中作为预期输出发布的内容。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:sp="urn:whatever"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="b">
        <sp:b emphasis="true">
            <xsl:apply-templates/>
        </sp:b>
    </xsl:template>

    <xsl:template match="i">
        <sp:i emphasis="true">
            <xsl:apply-templates/>
        </sp:i>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="sp:{local-name()}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

但是,达到预期输出存在一些问题:

  • 我添加了一个随机命名空间xmlns:sp="urn:whatever",因为你没有提供一个
  • 颜色的输入和输出之间存在结构差异。虽然输入中的颜色位于段落级别(p style="color:red;"),但它在输出中仅应用于段落的一部分。我没有在这里看到&#34;规则&#34;如何应用颜色。
  • <b>这样的标签在输入中是相同,但在输出中有不同的结果<sp:i> vs <sp:i emphasis="true">)。对于相同的输入,您不能有不同的结果。必须有明确的转换规则。

如果您有明确的转换规则,则应该能够根据需要完成样式表。