-1

XHTML ドキュメント内のノードをたどって、一連の条件に一致するすべてのノードの子を見つけ、ドキュメント階層内の深さに対する相対的な位置に基づいて名前を変更しようとしています。

例えば:

要素内のノードを反復処理し、h1、h2、h3、h4、h5、または h6 のすべてを h1 に変換したいと考えています。

次に、要素の他のすべての子を反復処理し、hN という名前の子ノードを見つけて、これらの名前を h2 にします。

などなど、子ノードを介した再帰の深さは無制限ですが、要素の名前付けは h6 の制限まで...

これは明らかですか?申し訳ありませんが、私はxslが初めてです。

これが私がこれまでに持っているものです:

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


<xsl:template match="*[contains(@class,'_col')]">
    <xsl:apply-templates select="*" mode="iterate"/>

</xsl:template>



<xsl:template match="*" mode="iterate">

    <xsl:if test="name()='h1' or name()='h2'or name()='h3'or name()='h4'or name()='h5'or name()='h6'">
        <h6>
            <xsl:apply-templates select="@*|node()"/>
        </h6>

    </xsl:if>
    <xsl:if test="name()!='h1' and name()!='h2' and name()!='h3' and name()!='h4' and name()!='h5' and name()!='h6'">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

明らかに、これはまったく機能しません。h# タグのインクリメントを除外して、すべての h# タグが h1 タグに変換された完全なドキュメントをシートに出力させることができれば、かなり気分が良くなります。誰でも助けてもらえますか?

ありがとう。

編集:

最初の答えは大きな助けになりますが、問題を明確にするために、すべての h# タグを 1 ずつ増やして最大 6 にするだけでなく、すべての h# タグを見つけて、それらをインクリメントした数 (最大 6) に設定する必要があります。ドキュメント階層の深さに応じて。

xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<body>
<h2>Theme</h2>
<div class="col _incidental">
    <h2>theme 2</h2>
    <div>
        <h3>theme 3</h3>
        <p>some thext</p>
    </div>
</div>
<div class="col _vital">
    <h2>theme 2</h2>
    <div>
        <h1>theme 3</h1>
        <p>some thext</p>
    </div>
    <h2>theme 2</h2>
    <div>
        <h4>theme 3</h4>
        <p>some thext</p>
        <h3>theme 3</h3>
        <p>some thext</p>
    </div>
</div>
<div class="col _related">
      <h2>theme 2</h2>
      </div>   
          <div>
                <h5>theme 3</h5>
                <p>some thext</p>
          </div>
      </div>
</div>
</body>

出力は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<body>
<h1>Theme</h1>
<div class="col _incidental">
    <h2>theme 2</h2>
    <div>
        <h3>theme 3</h3>
        <p>some thext</p>
    </div>
</div>
<div class="col _vital">
    <h2>theme 2</h2>
    <div>
        <h3>theme 3</h3>
        <p>some thext</p>
    </div>
    <h2>theme 2</h2>
    <div>
        <h3>theme 3</h3>
        <p>some thext</p>
        <h3>theme 3</h3>
        <p>some thext</p>
    </div>
</div>
<div class="col _related">
    <h2>theme 2</h2>
    <div>
        <div>
            <h3>theme 3</h3>
            <p>some thext</p>
        </div>
    </div>
</div>
</body>

変換には、最後に見つかった hN に対するドキュメント階層内の位置に従って番号が付けられた hN 要素が含まれます。したがって、h2 が見つかった場合、兄弟が検索され、hN が h3 になり、何も見つからない場合、兄弟が検索され、h3 になり、兄弟の hN 子孫が h4 になります。 . 意味がありますか?

4

1 に答える 1

1

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

 <xsl:template match=
 "*[starts-with(name(), 'H')
  and
    substring(name(),2) > 1
  and
    not(substring(name(),2) > 5)
   ]">

   <xsl:element name="h{substring(name(),2)+1}">
      <xsl:copy-of select="namespace::*"/>
     <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合(ソース XML ドキュメントが提供されていません!):

<html>
 <head/>
 <H2> Some H2</H2>

 <div>
   <H3>Some H3</H3>
   <div>
     <H4>Some H4</H4>

     <div>
       <H5>Some H5</H5>
     </div>
   </div>
 </div>
</html>

必要な正しい結果が生成されます。

<html>
   <head/>
   <h3> Some H2</h3>
   <div>
      <h4>Some H3</h4>
      <div>
         <h5>Some H4</h5>
         <div>
            <h6>Some H5</h6>
         </div>
      </div>
   </div>
</html>

説明:

  1. アイデンティティ ルールの適切な使用とオーバーライド。

  2. テンプレートと一致パターンの適切な使用。

  3. 標準の XPath 関数starts-with()substring().

  4. xsl:elementおよびAVT (属性値テンプレート) の適切な使用。

于 2012-09-25T02:13:44.830 に答える