1

如果我有以下 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

4

2 回答 2

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>

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

这是完整的 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>
于 2012-11-29T15:59:25.973 回答
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>
于 2012-11-30T12:32:28.720 回答