2012-01-06 17 views
1

私はXSLTファイルを使って、テーブルを表すXML文書をSQLコマンドに変換しています。私は、INSERTコマンドを作成するには、次のXSLTを書いたfor-each内のXSLT動的属性

<Table> 
<ObjectAttributes> 
    <AttributeDetail> 
    <Name>COLNAME1</Name> 
    ... 
    </AttributeDetail> 
    <AttributeDetail> 
    <Name>COLNAME2</Name> 
    ... 
    </AttributeDetail> 
    ... 
</ObjectAttributes> 
<Record RowID="00001"> 
    <Attributes> 
    <Attr> 
     <AttrName>COLNAME1</AttrName> 
     <AttrValue>VALUE</AttrValue> 
    </Attr> 
    <Attr> 
     <AttrName>COLNAME2</AttrName> 
     <AttrValue>VALUE</AttrValue> 
    </Attr> 
    ... 
    </Attributes> 
</Record> 
<Record RowID="00002"> 
    <Attributes> 
    <Attr> 
     <AttrName>COLNAME1</AttrName> 
     <AttrValue>VALUE</AttrValue> 
    </Attr> 
    <Attr> 
     <AttrName>COLNAME2</AttrName> 
     <AttrValue>VALUE</AttrValue> 
    </Attr> 
    ... 
    </Attributes> 
</Record> 
... 
</Table> 

<xsl:for-each select="/Table/Record"> 
    <xsl:variable name="ThisRecord" select="."/> 
    <Command> 
    INSERT INTO <xsl:value-of select="../ObjectName"/> 
     (ROWID, 
     <xsl:for-each select="../ObjectAttributes/AttributeDetail"> 
     <xsl:value-of select="Name"/> 
     <xsl:if test="position() != last()"> 
      <xsl:text>, </xsl:text> 
     </xsl:if> 
     </xsl:for-each>) 
     VALUES 
     (<xsl:value-of select="@RowID"/>, 
     <xsl:for-each select="../ObjectAttributes/AttributeDetail"> 
     <xsl:text>'</xsl:text><xsl:value-of select="$ThisRecord/Attributes/Attr/AttrValue[../AttrName='COLNAME1']"/><xsl:text>'</xsl:text> 
     <xsl:if test="position() != last()"> 
      <xsl:text>, </xsl:text> 
     </xsl:if> 
     </xsl:for-each>) 
    </Command> 
</xsl:for-each> 

これは、事実を除いて、素晴らしい作品XMLは、テーブルの列と次のような構造を持つデータの各行の両方を記述します私はから生じる値でAttrNameに=「」の値を交換する方法を見つけ出すのに苦労してること:私は変数に置き換える試みた

<xsl:value-of select="Name"/> 

が、THI sは動作しませんでした:

<xsl:variable name="ThisAttr" select="Name"/> 
<xsl:value-of select="$ThisRecord/Attributes/Attr/AttrValue[../AttrName='$ThisAttr']"/> 

この属性を動的に入力する方法はありますか。

ありがとうございます!

+0

あなただけのために、各/録音オーバー/属性名のために1回、2回属性、およびすることはできません属性値の2回目? ObjectAttributesの名前はAttributesセクションのAttrNameと同じですか? – dash

+0

これはうまくいくはずですが、レコードの属性がオブジェクトに確実に存在するように、各/ Record/AttributesをObjectAttributesにマッチさせたいと考えていました。 – Paul

+1

十分なフェア! $ thisRecord/Attributes/Attr [AttrName = $ ThisAttr]/AttrValue - あなたはあなたがattrNameという子でattrを見つけたと言うだけのあなたのAttrNameチェックを間違った場所に持っています= $ ThisAttrの名前をクリックし、AttrValueを選択します。 – dash

答えて

2

あなたはcurrent()と、現在のコンテキストノードを参照することができます。

<xsl:value-of 
    select="$ThisRecord/Attributes/Attr[AttrName=current()/Name]/AttrValue"/> 

私はあなたの変数アプローチがなしAttrName='$ThisAttr'内の変数の参照を囲む引用符をを働いていたことに注意してください。あなたは文字通り文字列$ThisAttrにマッチしています(つまり、変数を参照していません)。 AttrName=$ThisAttr(引用符なし)を使用してください。

つまり、current()を使用する方が良い解決策です。

(バックトラックが必要とされないように、私はまた、発現段階に再配置されたことに注意してください。)

+0

+1 - 私も変数を使用するつもりだったけれど、私もそれを打つ();-) – dash

+0

ヒントをありがとう。それは私が後にしたものです。再編成は良い考えでした。 – Paul