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

標準のXSTLIdentityTransformに基づいて構築する場合、これは簡単なタスクです。ref要素と一致するテンプレートが必要であり、代わりに要素を出力します。

<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属性を持つことが保証されている場合は、次のように、これら2つのテンプレートを1つに単純化することもできます。

<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>
于 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 に答える