0

私は次のようなXSLT1.0を持っています:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="paragraph">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
</xsl:stylesheet>

ただ、最初のテンプレートに似たテンプレートがたくさんあります。これらの各テンプレートで特定の属性を発行したいのですが、それを実現するために最も侵襲性の低い変更を加えたいと思います。これが私が最初に試したものです:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="paragraph">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>

  <xsl:template match="@class">
    <xsl:attribute name="class">
      <xsl:value-of select="@class"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

しかし、それはうまくいきませんでした。私はこれを試しました:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="paragraph">
    <p>
      <xsl:attribute name="class">
        <xsl:value-of select="@class"/>
      </xsl:attribute>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
</xsl:stylesheet>

ただし、すべてのテンプレートでこれを機能させるには、多くのコードの重複が必要になります。それが私にできる最善のことですか、それともこれを機能させるためのより適切な方法がありますか?

4

2 に答える 2

2

既存のテンプレートルールを本当に変更したくない場合は、次のように、「p」などのルールよりも優先度の高いテンプレートルールを追加します。

<xsl:template match="*[@class]" priority="100">
  <xsl:variable name="v">
    <xsl:next-match/>
  </xsl:variable>
  <xsl:apply-templates select="$v" mode="add-attribute">
    <xsl:with-param name="att" select="@class"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="*" mode="add-attribute">
  <xsl:param name="att" as="attribute()"/>
  <xsl:copy>
     <xsl:copy-of select="@*, $att"/>
     <xsl:apply-templates mode="#current"/>
  </xsl:copy>
</xsl:template>

1.0では、これを別のモジュールに配置し、next-matchではなくapply-importsを使用する必要があります。

于 2012-09-20T08:06:32.990 に答える
2

あなたの最初の試みで

  <xsl:template match="@class">
    <xsl:attribute name="class">
      <xsl:value-of select="@class"/>
    </xsl:attribute>
  </xsl:template>

このテンプレートのコンテキストノードはclass属性ノードであるため、次value-ofを選択する必要があります.

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

ただし、bareは現在のノードの子<xsl:apply-templates/>に一致するテンプレートのみを適用し、属性ノードはXSLTデータモデルの子としてカウントされないため、このテンプレートは起動しないことにも注意してください。あなたはおそらく言うためにあなたのテンプレートを変更する必要があります@classparagraph

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

paragraph要素の属性とその子に一致するテンプレートを適用します。

于 2012-09-19T22:30:15.373 に答える