2012-03-20 20 views
2

異なる「要素」にいくつかの定義済みの属性セットを設定する必要のある大きな「xsl:choose」チャンクがある場合。変数を格納して出力属性を使用する

私は実際には、「選択」の各ブランチの内側で一連の属性の定義を繰り返すのは好きではありません。 これらの属性を含む変数を使用して作業したいと思います。 メンテナンスが簡単で、エラーの余地が少ない...

これまでのところ、属性ノードを呼び出すことができませんでしたか? 私はそれらが単なるノードセットだと思ったので、copy-ofはそのトリックを行います。
しかし、それは私には何も出力されません。
これは属性ノードが実際に子ノードではないためですか?これはで行うことができない場合
しかし、XSLT 1.Oは私が直接それらに対処することはできません... <xsl:copy-of select="$attributes_body/@*/>はここでエラー

を返しますが(元から減少)スタイルシートフラグメント

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="list"> 
    <xsl:for-each select="figure"> 
    <xsl:variable name="attributes_body"> 
    <xsl:attribute name="chapter"><xsl:value-of select="@chapter"/></xsl:attribute> 
    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
    </xsl:variable> 
    <xsl:variable name="attributes_other"> 
     <xsl:attribute name="chapter"><xsl:value-of select="@book"/></xsl:attribute> 
     <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="ancestor::body"> 
      <xsl:element name="entry"> 
      <xsl:copy-of select="$attributes_body"/> 
      <xsl:text>Body fig</xsl:text> 
      </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="entry"> 
      <xsl:copy-of select="$attributes_other"/> 
      <xsl:text>other fig</xsl:text> 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose>   
    </xsl:for-each>  
</xsl:template> 

ですXLST 1.0では2.0がこれを行うことができますか?

+0

このヘルプを願っていました。属性からの入力データを変数に格納(および後で取得)したいですか?もしそうなら、入力XML/htmlは何ですか?もしそうなら、xsl:templateの代わりにxsl:variableを使いたいと思うでしょう。そして、使用しているネストされたxsl:変数が間違っています。だから、入力と期待される出力に加えて、変数ストア+検索のアプローチを追加してください。それから、より良いアドバイスをすることができます。 – Maestro13

+0

@ Maestro13ドキュメント内のすべての 'figure'要素のリストを作成します。さまざまな条件に応じて、リストには事前設定された属性セットを持つ要素が含まれます。それらの属性は、ソース文書にある各「figure」要素に依存する値を持ちます。あなたを混乱させるかもしれないと思うのは、私が別のフィギュア要素を再放出したということでした。元のスタイルシートを編集して別の名前の要素を出力します。 –

+0

@ Maestro13また、属性のセットを何度も繰り返したくないので、属性のセットを別の変数に格納したいと考えています。私はそれがあなたにもう少し明確になることを願っています。 –

答えて

4
<xsl:variable name="attributes_body"> 
    <xsl:attribute name="chapter"><xsl:value-of select="@chapter"/></xsl:attribute> 
    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
</xsl:variable> 

あなたは希望の属性を選択する必要がある - 変数の体内にその内容をコピーすることはありません。覚えておいてください

:可能な限り、xsl:variableselect属性にXPath式を指定するために、常に試みる - その本体でコピーコンテンツを避けます。

ソリューション:このに適用されたとき

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

    <xsl:template match="x/a"> 
     <xsl:variable name="vAttribs" select="@m | @n"/> 

     <newEntry> 
     <xsl:copy-of select="$vAttribs"/> 
     <xsl:value-of select="."/> 
     </newEntry> 
    </xsl:template> 
</xsl:stylesheet> 

だけ使用します。ここでは

<xsl:variable name="attributes_body" select="@chapter | @id"> 

は完全な例である

<x> 
<a m="1" n="2" p="3">zzz</a> 
</x> 

を生成します。

私の場合は
<newEntry m="1" n="2">zzz</newEntry> 
+0

Novtchev:属性セットは悲しいほど飛行しません。属性内に格納された値はfor-eachループ内の選択されたノードから読み取られなければなりません。アトリビュートセットはトップレベルの要素なので、これをどうやって行うのか分かりません。 私の例では、@ id属性を例にとります。その値は、for-eachループ内の選択された 'figure'ノードのIDでなければなりません。 –

+0

@HafLinger:答えを編集しました。 –

+0

hmmm ...そして、これをリストに載っている「エントリー」ノードの2つの異なる属性としてどのように出力しますか? 私は本当に 'のような出力がほしいと思っています。' –

1

、私はここでtag-name/@attribute-inside-tag-name

この構文を使用し、そうすることをvariable

storeにタグattributeをしようとしていました例です

<xsl:variable name="articleLanguage" select="/article/@language"/><!--the tricky part --> 
//<!--now you can use this this varialbe as you like --> 
<xsl:apply-templates select="front/article-meta/kwd-group[@language=$articleLanguage]"/> 

とxml

<article article-type="research-article" language="es" explicit-lang="es" dtd-version="1.0"> 
..... 

あなたはそれはあなたが達成しようとするものを私に正確には明らかではありません

関連する問題