1

こんにちは、ID テンプレートを使用してファイル全体をコピーするときに、XSLT を使用して特定のタグの複数の属性を置き換える必要があります。与えられた XSLT を使用すると、1 つの属性 (クラスの値) を置き換えることができますが、他の属性を置き換えることはできません。 入力ファイル:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta name="generator" content=
  "HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" />
  <meta http-equiv="Content-type" content="text/html; charset=us-ascii" />

  <title></title>
</head>

<body>
  <!--OTHER STUFF-->    
  <div class="LR" id="12">
  </div>
  <!--OTHER STUFF-->
</body>
</html>

出力ファイル:

<?xml version="1.0" encoding="utf-8"?>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta name="generator" content=
  "HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" />
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />

  <title></title>
</head>

<body>
  <!--OTHER STUFF-->
  <div class="WZ" id="56">
  </div>
  <!--OTHER STUFF-->
</body>
</html>

私のXSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns="http://www.w3.org/1999/xhtml"
 exclude-result-prefixes="xhtml">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*" />

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

<xsl:template match="xhtml:div[@id='12']/@class">
  <xsl:attribute name="class">WZ</xsl:attribute>
   <xsl:attribute name="id">56</xsl:attribute> 
</xsl:template>

</xsl:stylesheet>

ありがとうございます!

4

2 に答える 2

6

このテンプレートは、<div> ノードが持つ可能性のある追加の属性もコピーするため、より堅牢なソリューションになります。

このテンプレート...

<xsl:template match="xhtml:div[@id='12']"
  xmlns="http://www.w3.org/1999/xhtml">
  <div id="56" class="WZ">
    <xsl:apply-templates select="
      (@*[local-name()!='id']
         [local-name()!='class'])
      | node()"/>
  </div>
</xsl:template>

...この要素を変換します...

<div class="LR" id="12" other="x">

...の中へ...

<div id="56" class="WZ" other="x" />

追加の属性「その他」が保持されていることに注意してください。


アップデート

質問に答えるよりも一般的な関心のために、ここにいくつかの同等の代替手段があります...

XSLT 1.0 代替

同じことを行う別の XSLT 1.0 テンプレートを次に示します。効率は劣りますが、より簡潔です(まあ、一種の)...

<xsl:template match="xhtml:div[@id='12']"
  xmlns="http://www.w3.org/1999/xhtml">
  <div>
    <xsl:apply-templates select="@*" />
    <xsl:attribute name="id">56</xsl:attribute>
    <xsl:attribute name="class">WZ</xsl:attribute>
    <xsl:apply-templates select="node()" />
  </div>
</xsl:template>

XSLT 2.0 代替

OPがXSLT 1.0を使用していることは知っています。これはただの興味です。簡潔さと効率の両方が必要ですか? 決して恐れるな!この XSLT 2.0 の代替案に関するヘルプはこちらです...

<xsl:template match="xhtml:div[@id='12']"
  xmlns="http://www.w3.org/1999/xhtml">
  <div id="56" class="WZ">
    <xsl:apply-templates select="@* except (@id,@class) | node()" />
  </div>
</xsl:template>
于 2012-07-25T09:31:18.867 に答える
-1

マッチングしてみてください@*

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns="http://www.w3.org/1999/xhtml"
  exclude-result-prefixes="xhtml">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[@id='12']/@*">
    <xsl:attribute name="class">WZ</xsl:attribute>
    <xsl:attribute name="id">56</xsl:attribute>
</xsl:template>
</xsl:stylesheet>

これにより、望ましい結果が得られます。

<div class="WZ" id="56"></div>
于 2012-07-25T04:59:14.920 に答える