如何使用XSL用标签包装XML文本

时间:2015-09-07 11:23:19

标签: xml xslt

我想要使用XSL包装文本节点并使用标签构建它们。 下面是一个样本。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <section>
        <container>
            aaa
            <box>
                book
            </box>
            bbb
            <box>
                pen
            </box>
            ccc
            <superscript>
                3
            </superscript>
            ddd
        </container>
    </section>
</root>

是否可以获得如下结果?

<div>
    <p>aaa</p>
    <div>book</div>
    <p>bbb</p>
    <div>pen</div>
    <p>ccc<span>3</span>ddd</p>
</div>

如果你再帮助我,我很高兴!

1 个答案:

答案 0 :(得分:2)

  

是否可以获得如下结果?

是。假设您从copy idiom开始,则可以添加以下内容:

<xsl:strip-space elements="*"/>

<!-- these we want to turn into a <div> and then process children -->
<xsl:template match="box | container | section | formula">
    <div>
        <xsl:apply-templates />
    </div>
</xsl:template>

<!-- if text node but not directly inside <box> -->
<xsl:template match="text()[not(parent::box)]">
    <p>
        <xsl:value-of select="." />
    </p>
</xsl:template>

<!-- any other text node as-is -->
<xsl:template match="text()">
    <xsl:value-of select="." />
</xsl:template>

注1:您的示例XML不是有效的XML,但我认为您的意思是</container>,而不是</formula>

注2:复制习语会复制所有不匹配的内容。如果您不想这样,请将其更改为:

<!-- remove anything we do not need -->
<xsl:template match="node() | @*">
   <xsl:apply-templates />
</xsl:template>

编辑:纠正了代码中的一些缺陷。它现在创建(添加空间以便于阅读)以下内容:

<div>
   <div>
      <p>aaa</p>
      <div>book</div>
      <p>bbb</p>
      <div>pen</div>
      <p>ccc</p>
   </div>
</div>