位于段落文本中的XSL转换子节点

时间:2010-12-03 12:34:32

标签: xslt

假设我有以下xml,我需要将note标记内的p标记转换为sup标记需要什么xsl?

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<root>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent<note>1</note> vel nisi non sapien venenatis vehicula. Nunc et dignissim ligula. Praesent aliquet nisl eget quam sollicitudin a faucibus eros dapibus. Aliquam cursus elit at tortor lacinia congue. Donec sit amet felis risus, a mollis ante. Integer sit amet massa sed metus semper cursus id id enim. Vestibulum felis nunc, pellentesque non lobortis et, porttitor eu libero. Curabitur eget nulla quam. Etiam erat arcu, vulputate sed volutpat consequat, adipiscing et tortor. Quisque imperdiet laoreet fermentum. Mauris ac felis vel lectus semper posuere. Etiam luctus augue et odio suscipit varius. Curabitur tincidunt purus quis tellus pretium imperdiet. In rhoncus rutrum orci, sed venenatis sem volutpat non. Curabitur tincidunt lacinia sem at luctus. Donec et diam eu massa interdum dapibus a et elit. Donec malesuada urna et nunc volutpat gravida.</p>
<p>Donec varius placerat venenatis. In neque sem, sollicitudin sed eleifend et, tristique eu turpis. Donec quis nisi lectus. Nullam gravida vestibulum arcu non aliquet. Nullam ut felis metus. Proin mollis tellus eu eros iaculis eget tristique leo fermentum. Pellentesque nec lorem vitae nibh eleifend euismod. Pellentesque nec gravida neque. Praesent mattis mi sed nisi sodales porta. Morbi risus mauris, convallis at condimentum a, interdum nec purus. Cras vulputate faucibus tempor. Aliquam eu dolor sed eros malesuada pharetra vitae vitae est. Suspendisse lacinia urna vitae mi bibendum quis<note>2</note> scelerisque augue tristique. Aenean at arcu tellus, eu placerat enim. Cras ultrices iaculis augue vitae pharetra. Praesent suscipit blandit scelerisque. Mauris et molestie purus. Vivamus volutpat enim sem, eget scelerisque turpis. Praesent viverra lectus in ipsum tristique blandit. Donec lobortis molestie purus, at feugiat leo rhoncus eget.</p>
<p>Vivamus eget convallis massa. Etiam convallis gravida tincidunt. Suspendisse tincidunt dignissim accumsan. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam commodo placerat egestas. Donec convallis sodales volutpat. Quisque dapibus lobortis augue sit amet rhoncus. Nulla sed sem nisl, in feugiat orci. Quisque vehicula iaculis nisi ut auctor. Integer molestie nisl eget diam pharetra interdum. Mauris aliquet, libero vel congue egestas, velit est pretium leo, luctus commodo risus diam sed odio. Nullam pretium blandit ligula, quis commodo massa rhoncus eu. Nunc in hendrerit mi. Cras quis orci ut metus lacinia eleifend id eu nisi. Nunc id varius diam. Aliquam eu porta velit. Curabitur eget<note>3</note> odio neque, et aliquam nisi.</p>
<notes>
<note><nr>1</nr>Suspendisse tincidunt dignissim accumsan</note>
<note><nr>2</nr>Nunc et dignissim ligula</note>
<note><nr>3</nr>eget convallis massa</note>
</notes>
</root>

和xsl stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/root/*">
  <html>
  <body>
    <xsl:for-each select=".">
      <xsl:choose>
        <xsl:when test="name() = 'p'">
          <p><xsl:value-of select="." /></p>
        </xsl:when>
        <xsl:when test="name() = 'notes'">
          <p><xsl:value-of select="." /></p>
        </xsl:when>
      </xsl:choose>
    </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

  

假设我有以下xml,那是什么   xsl我需要转换note   p标记内的标记为sup   标记

此转化 identity rule 加上p/note的覆盖:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="p/note">
  <sup><xsl:apply-templates/></sup>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<root>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent
        <note>1</note> vel nisi non sapien venenatis vehicula. Nunc et dignissim ligula. Praesent aliquet nisl eget quam sollicitudin a faucibus eros dapibus. Aliquam cursus elit at tortor lacinia congue. Donec sit amet felis risus, a mollis ante. Integer sit amet massa sed metus semper cursus id id enim. Vestibulum felis nunc, pellentesque non lobortis et, porttitor eu libero. Curabitur eget nulla quam. Etiam erat arcu, vulputate sed volutpat consequat, adipiscing et tortor. Quisque imperdiet laoreet fermentum. Mauris ac felis vel lectus semper posuere. Etiam luctus augue et odio suscipit varius. Curabitur tincidunt purus quis tellus pretium imperdiet. In rhoncus rutrum orci, sed venenatis sem volutpat non. Curabitur tincidunt lacinia sem at luctus. Donec et diam eu massa interdum dapibus a et elit. Donec malesuada urna et nunc volutpat gravida.
    </p>
    <p>Donec varius placerat venenatis. In neque sem, sollicitudin sed eleifend et, tristique eu turpis. Donec quis nisi lectus. Nullam gravida vestibulum arcu non aliquet. Nullam ut felis metus. Proin mollis tellus eu eros iaculis eget tristique leo fermentum. Pellentesque nec lorem vitae nibh eleifend euismod. Pellentesque nec gravida neque. Praesent mattis mi sed nisi sodales porta. Morbi risus mauris, convallis at condimentum a, interdum nec purus. Cras vulputate faucibus tempor. Aliquam eu dolor sed eros malesuada pharetra vitae vitae est. Suspendisse lacinia urna vitae mi bibendum quis
        <note>2</note> scelerisque augue tristique. Aenean at arcu tellus, eu placerat enim. Cras ultrices iaculis augue vitae pharetra. Praesent suscipit blandit scelerisque. Mauris et molestie purus. Vivamus volutpat enim sem, eget scelerisque turpis. Praesent viverra lectus in ipsum tristique blandit. Donec lobortis molestie purus, at feugiat leo rhoncus eget.
    </p>
    <p>Vivamus eget convallis massa. Etiam convallis gravida tincidunt. Suspendisse tincidunt dignissim accumsan. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam commodo placerat egestas. Donec convallis sodales volutpat. Quisque dapibus lobortis augue sit amet rhoncus. Nulla sed sem nisl, in feugiat orci. Quisque vehicula iaculis nisi ut auctor. Integer molestie nisl eget diam pharetra interdum. Mauris aliquet, libero vel congue egestas, velit est pretium leo, luctus commodo risus diam sed odio. Nullam pretium blandit ligula, quis commodo massa rhoncus eu. Nunc in hendrerit mi. Cras quis orci ut metus lacinia eleifend id eu nisi. Nunc id varius diam. Aliquam eu porta velit. Curabitur eget
        <note>3</note> odio neque, et aliquam nisi.
    </p>
    <notes>
        <note>
            <nr>1</nr>Suspendisse tincidunt dignissim accumsan
        </note>
        <note>
            <nr>2</nr>Nunc et dignissim ligula
        </note>
        <note>
            <nr>3</nr>eget convallis massa
        </note>
    </notes>
</root>

生成想要的正确结果

<root>
   <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent
        <sup>1</sup> vel nisi non sapien venenatis vehicula. Nunc et dignissim ligula. Praesent aliquet nisl eget quam sollicitudin a faucibus eros dapibus. Aliquam cursus elit at tortor lacinia congue. Donec sit amet felis risus, a mollis ante. Integer sit amet massa sed metus semper cursus id id enim. Vestibulum felis nunc, pellentesque non lobortis et, porttitor eu libero. Curabitur eget nulla quam. Etiam erat arcu, vulputate sed volutpat consequat, adipiscing et tortor. Quisque imperdiet laoreet fermentum. Mauris ac felis vel lectus semper posuere. Etiam luctus augue et odio suscipit varius. Curabitur tincidunt purus quis tellus pretium imperdiet. In rhoncus rutrum orci, sed venenatis sem volutpat non. Curabitur tincidunt lacinia sem at luctus. Donec et diam eu massa interdum dapibus a et elit. Donec malesuada urna et nunc volutpat gravida.
    </p>
   <p>Donec varius placerat venenatis. In neque sem, sollicitudin sed eleifend et, tristique eu turpis. Donec quis nisi lectus. Nullam gravida vestibulum arcu non aliquet. Nullam ut felis metus. Proin mollis tellus eu eros iaculis eget tristique leo fermentum. Pellentesque nec lorem vitae nibh eleifend euismod. Pellentesque nec gravida neque. Praesent mattis mi sed nisi sodales porta. Morbi risus mauris, convallis at condimentum a, interdum nec purus. Cras vulputate faucibus tempor. Aliquam eu dolor sed eros malesuada pharetra vitae vitae est. Suspendisse lacinia urna vitae mi bibendum quis
        <sup>2</sup> scelerisque augue tristique. Aenean at arcu tellus, eu placerat enim. Cras ultrices iaculis augue vitae pharetra. Praesent suscipit blandit scelerisque. Mauris et molestie purus. Vivamus volutpat enim sem, eget scelerisque turpis. Praesent viverra lectus in ipsum tristique blandit. Donec lobortis molestie purus, at feugiat leo rhoncus eget.
    </p>
   <p>Vivamus eget convallis massa. Etiam convallis gravida tincidunt. Suspendisse tincidunt dignissim accumsan. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam commodo placerat egestas. Donec convallis sodales volutpat. Quisque dapibus lobortis augue sit amet rhoncus. Nulla sed sem nisl, in feugiat orci. Quisque vehicula iaculis nisi ut auctor. Integer molestie nisl eget diam pharetra interdum. Mauris aliquet, libero vel congue egestas, velit est pretium leo, luctus commodo risus diam sed odio. Nullam pretium blandit ligula, quis commodo massa rhoncus eu. Nunc in hendrerit mi. Cras quis orci ut metus lacinia eleifend id eu nisi. Nunc id varius diam. Aliquam eu porta velit. Curabitur eget
        <sup>3</sup> odio neque, et aliquam nisi.
    </p>
   <notes>
      <note>
         <nr>1</nr>Suspendisse tincidunt dignissim accumsan
        </note>
      <note>
         <nr>2</nr>Nunc et dignissim ligula
        </note>
      <note>
         <nr>3</nr>eget convallis massa
        </note>
   </notes>
</root>

答案 1 :(得分:0)

您需要将p/note更改为sup是一个身份模板(搜索SO,有很多答案)和另一个匹配p/note的模板(见下文) )。

但是我会选择这样的东西,因为你的样式表产生了一些奇怪的输出,但它不一定是你想要的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

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

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

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

  <xsl:template match="notes">
    <ol>
      <xsl:apply-templates>
        <xsl:sort select="nr" data-type="number"/>
      </xsl:apply-templates>
    </ol>
  </xsl:template>

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

  <xsl:template match="nr"/>

</xsl:stylesheet>

这会将您的数据转换为包含p/notesupnotes/note到有序列表的HTML文档。

答案 2 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="root">
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="p">
        <p>
            <xsl:apply-templates/>
        </p>
    </xsl:template>
    <xsl:template match="p/note" name="sup">
        <sup>
            <xsl:apply-templates/>
        </sup>
    </xsl:template>
    <xsl:template match="notes/note">
        <p>
            <xsl:call-template name="sup"/>
        </p>
    </xsl:template>
    <xsl:template match="nr">
        <b style="margin-right:5px">
            <xsl:apply-templates/>
        </b>
    </xsl:template>
</xsl:stylesheet>

输出:

<html>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent<sup>1</sup> vel nisi non sapien venenatis vehicula. Nunc et dignissim ligula. Praesent aliquet nisl eget quam sollicitudin a faucibus eros dapibus. Aliquam cursus elit at tortor lacinia congue. Donec sit amet felis risus, a mollis ante. Integer sit amet massa sed metus semper cursus id id enim. Vestibulum felis nunc, pellentesque non lobortis et, porttitor eu libero. Curabitur eget nulla quam. Etiam erat arcu, vulputate sed volutpat consequat, adipiscing et tortor. Quisque imperdiet laoreet fermentum. Mauris ac felis vel lectus semper posuere. Etiam luctus augue et odio suscipit varius. Curabitur tincidunt purus quis tellus pretium imperdiet. In rhoncus rutrum orci, sed venenatis sem volutpat non. Curabitur tincidunt lacinia sem at luctus. Donec et diam eu massa interdum dapibus a et elit. Donec malesuada urna et nunc volutpat gravida.</p>
<p>Donec varius placerat venenatis. In neque sem, sollicitudin sed eleifend et, tristique eu turpis. Donec quis nisi lectus. Nullam gravida vestibulum arcu non aliquet. Nullam ut felis metus. Proin mollis tellus eu eros iaculis eget tristique leo fermentum. Pellentesque nec lorem vitae nibh eleifend euismod. Pellentesque nec gravida neque. Praesent mattis mi sed nisi sodales porta. Morbi risus mauris, convallis at condimentum a, interdum nec purus. Cras vulputate faucibus tempor. Aliquam eu dolor sed eros malesuada pharetra vitae vitae est. Suspendisse lacinia urna vitae mi bibendum quis<sup>2</sup> scelerisque augue tristique. Aenean at arcu tellus, eu placerat enim. Cras ultrices iaculis augue vitae pharetra. Praesent suscipit blandit scelerisque. Mauris et molestie purus. Vivamus volutpat enim sem, eget scelerisque turpis. Praesent viverra lectus in ipsum tristique blandit. Donec lobortis molestie purus, at feugiat leo rhoncus eget.</p>
<p>Vivamus eget convallis massa. Etiam convallis gravida tincidunt. Suspendisse tincidunt dignissim accumsan. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam commodo placerat egestas. Donec convallis sodales volutpat. Quisque dapibus lobortis augue sit amet rhoncus. Nulla sed sem nisl, in feugiat orci. Quisque vehicula iaculis nisi ut auctor. Integer molestie nisl eget diam pharetra interdum. Mauris aliquet, libero vel congue egestas, velit est pretium leo, luctus commodo risus diam sed odio. Nullam pretium blandit ligula, quis commodo massa rhoncus eu. Nunc in hendrerit mi. Cras quis orci ut metus lacinia eleifend id eu nisi. Nunc id varius diam. Aliquam eu porta velit. Curabitur eget<sup>3</sup> odio neque, et aliquam nisi.</p>
<p><sup><b style="margin-right:5px">1</b>Suspendisse tincidunt dignissim accumsan</sup></p>
<p><sup><b style="margin-right:5px">2</b>Nunc et dignissim ligula</sup></p>
<p><sup><b style="margin-right:5px">3</b>eget convallis massa</sup></p>
</body>
</html>

渲染:

Lorem ipsum dolor坐下来,精神上的精神。 Praesent 1 vel nisi non sapien venenatis vehicula。 Nunc et dignissim ligula。 Praesent aliquet nisl eget quam sollicitudin faucibus eros dapibus。 Aliquam cursus elit at tortor lacinia congue。 Donec坐在felis risus,一个mollis ante。整数坐在amet massa sed metus semper cursus id id enim。 Vestibulum felis nunc,pellentesque non lobortis et,porttitor eu libero。 Curabitur eget nulla quam。 Etiam erat arcu,vulputate sed volutpat consequat,adipiscing et tortor。 Quisque imperdiet laoreet fermentum。 Mauris ac felis vel lectus semper posuere。 Etiam luctus augue et odio suscipit varius。 Curabitur tincidunt purus quis tellus pretium imperdiet。在rhoncus rut​​rum orci,sed venenatis sem volutpat non。在luctus的Curabitur tincidunt lacinia sem。 Donec et diam eu massa interdum dapibus a et elit。 Donec malesuada urna et nunc volutpat gravida。

Donec varius placerat venenatis。在neque sem,sollicitudin sed eleifend et,tristique eu turpis。 Donec quis nisi lectus。 Nullam gravida vestibulum arcu non aliquet。 Nullam ut felis metus。 Proin mollis tellus eu eros iaculis eget tristique leo fermentum。 Pellentesque nec lorem vitae nibh eleifend euismod。 Pellentesque nec gravida neque。 Praesent mattis mi sed nisi sodales porta。 Morbi risus mauris,conallis在condimentum a,interdum nec purus。 Cras vulputate faucibus tempor。 Aliquam eu dolor sed eros malesuada pharetra vitae vitae est。Suspendisse lacinia urna vitae mi bibendum quis 2 scelerisque augue tristique。 Aenean at arcu tellus,eu placerat enim。 Cras ultrices iaculis augue vitae pharetra。 Praesent suscipit blandit scelerisque。 Mauris et molestie purus。 Vivamus volutpat enim sem,eget scelerisque turpis。在ipsum tristique blandit的Praesent viverra lectus。 Donec lobortis molestie purus,在feugiat leo rhoncus eget。

Vivamus eget convallis massa。 Etiam convallis gravida tincidunt。 Suspendisse tincidunt dignissim accumsan。 Lorem ipsum dolor坐下来,精致的adipistur elit。 Etiam commodo placerat egestas。 Donec convallis sodales volutpat。 Quisque dapibus lobortis augue坐amet rhoncus。 Nulla sed sem nisl,在feugiat orci。 Quisque vehicula iaculis nisi ut auctor。整数molestie nisl eget diam pharetra interdum。 Mauris aliquet,libero vel congue egestas,velit est pretium leo,luctus commodo risus diam sed odio。 Nullam pretium blandit ligula,quis commodo massa rhoncus eu。 Nunc in hendrerit mi。 Cras quis orci ut metus lacinia eleifend id eu nisi。 Nunc id varius diam。 Aliquam eu porta velit。 Curabitur eget 3 odio neque,et aliquam nisi。

1Suspendisse tincidunt dignissim accumsan

2Nunc et dignissim ligula

3eget convallis massa

此外,还有一个XSLT 2.0样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="root">
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="p|notes/note">
        <p>
            <xsl:next-match/>
        </p>
    </xsl:template>
    <xsl:template match="note" name="sup">
        <sup>
            <xsl:apply-templates/>
        </sup>
    </xsl:template>
    <xsl:template match="nr">
        <b>
            <xsl:apply-templates/>
        </b>
        <xsl:text> </xsl:text>
    </xsl:template>
</xsl:stylesheet>