将模板应用于文本段落中的元素?

时间:2012-11-29 15:31:36

标签: xslt

如果我要获得以下XML文档......

<?xml version="1.0"?>
<document>
  <title>Foobar</title>
  <article>
    Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
    dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.

    <ref url="http://en.wikipedia.org/wiki/FooBar">Foobar</ref> potenti. 
    Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
  </article>
</document>

...我如何将article元素翻译成以下内容?

<p>
  Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
  dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.

  <a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti. 
  Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
</p>

具体来说,这是我感兴趣的refa翻译,因为它嵌入了纯文本块中。

2 个答案:

答案 0 :(得分:4)

如果您使用标准的XSTL身份转换,这是一项简单的任务,您只需要一个模板来匹配 ref 元素并输出 a 元素代替。

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

要替换该属性,您可以使用另一个模板

<xsl:template match="ref/@url">
   <xsl:attribute name="href">
      <xsl:value-of select="." />
   </xsl:attribute>
</xsl:template>

请注意,如果您的 ref 元素始终具有 url 属性,您还可以将这两个模板简化为一个,如下所示:

<xsl:template match="ref">
   <a href="{@url}">
      <xsl:apply-templates select="node()"/>
   </a>
</xsl:template>

然后,您可以添加其他模板以根据需要替换任何其他元素,例如文章更改为 p ,以及不输出的模板标题元素。

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

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

   <xsl:template match="title" />

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

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

   <xsl:template match="ref/@url">
      <xsl:attribute name="href">
         <xsl:value-of select="." />
      </xsl:attribute>
   </xsl:template>

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

当应用于您的示例XML时,输出以下内容

<p>
    Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
    dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus.

    <a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti. 
    Duis placerat laoreet est nec fringilla. Quisque vitae semper erat.
  </p>

答案 1 :(得分:0)

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

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

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

<xsl:template match="title">
<xsl:copy-of select="."/>
</xsl:template>

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

<xsl:template match="ref">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:apply-templates/>
</a>
</xsl:template>
</xsl:stylesheet>