2009-03-23 9 views
1

タイトルはほとんどすべてを言います。私はXSLTで処理しているXML文書を持っていますが、XML文書に含まれる列(フィールド)の数はわかりません(したがって、名前はわかりません)。 "未知"のフィールドの数はどのようにして決定できますか?また、未知のフィールドの属性を読み取るにはどうすればよいですか?XSLTの不明な列を反復する方法

例のデータ....

<Dataset> 
    <Row> 
     <UnknownCol1 Msg="HowDoIGetThisMsgAttribute?"/> 
     <UnknownCol2 /> 
     <UnknownCol3 /> 
    </Row> 
</Dataset> 
+0

を、私は正確な数のわからないんだけど未知数は関連しています。通常、XSLTパターンは、特に割り当てがないため、未知数を管理するために使用されます。あなたはどんな種類の変革をより明確にすることができますか? –

+0

@OneSourceこれは私があなたの質問を理解した方法です...編集は簡単です:単純にどこでも述語を削除してください。 –

+0

@OneSourceこれらは「XPath式」と呼ばれ、XPath式が許可されているXSLTのどこでも使用できます。主に、...など。 –

答えて

2

「不明な」フィールドの数を確認するにはどうすればよいですか?

このXPath式:要素のカウントに

count(/*/*/*) 

evalutes、XML文書の最上位ノードの子である要素の再児童こと - 正確に何でありますこの場合は欲しかった。

"Row"要素は、名前が「UnknownCol」で始まっていない子どもたち、

を持つことができる場合、このXPath式は、名前「UnknownCol」で始まる要素の数を提供し、それはその要素の子でありますトップ要素の子は、次のとおりです。

count(/*/*/*[starts-with(name(), "UnknownCol")]) 

トップ要素が"Row"以外の子を持つことが場合は、その後、必要な数を与えるXPath式は次のとおりです。

count(/*/Row/*[starts-with(name(), "UnknownCol")]) 

また、不明なフィールドについては、 がある場合はどのように属性を読み取ることができますか?XPathの:)

/*/Row/*[starts-with(name(), "UnknownCol")]/@* 

を知ることによって

は全て "UnknownCol" {文字列}要素

のすべての属性を選択し、このXPath式は私達にこれらの属性の数を与える:

count(/*/Row/*[starts-with(name(), "UnknownCol")]/@*) 

このXpath式は、k番目のそのような属性の名前を与えます($ indは番号kに設定する必要があります):

name((/*/Row/*[starts-with(name(), "UnknownCol")]/@*)[$ind]) 

そして最後には、このXPath式は、k番目のような属性の値を生成します。

string((/*/Row/*[starts-with(name(), "UnknownCol")]/@*)[$ind]) 

編集:OPは、彼は完全に子供要素の名前をlnowていないとコメント

修正は簡単です:単にすべての式から述語を削除します。ここでは

count(/*/*/*) 

count(/*/Row/*) 


/*/Row/*/@* 


count(/*/Row/*/@*) 

name((/*/Row/*/@*)[$ind]) 

string((/*/Row/*/@*)[$ind]) 
+0

Dimitre、ありがとう。私はあなたの例で "UnknownCol"を参照しているので、上記のどれが役に立つのか分かりません。私は実行時に列名を知らないでしょう。 – OneSource

+0

@OneSourceこれは私があなたの質問を理解する方法です...編集は簡単です:単純にどこでも述語を削除してください。 –

+0

@Dimitre ....私はあなたの応答をより詳しく見て、述語部分を削除することを考え出しました。私はすべて設定する必要があります(私はXSLTドキュメント内でこれらの関数を使用できると仮定します)。あなたの助けを大変感謝します! – OneSource

2

この問題を回避する簡単な方法があります。あなたがこののより具体的な例を望んでいた場合、あなたはあなたがしたい正確に何であなたの質問をより明確にすることをお勧めします

select='/Dataset/Row/*/@Msg' 

:あなたは次のXPathを使用することができてたとえば

データと未知の列が含まれています。あなたはそれを正確にコピーしていますか?具体的には何に変換したいのですか?一致させたいキーがありますか?

そのようなもの。

+0

Jweede、ご回答いただきありがとうございます。あなたの質問に私の能力の最大限にお答えします: 私はXMLをとり、それをXSLTで変換したいと思います。私は入力データを正確にコピーしませんでしたが、上記は正確な近似値です。私はそれをHTMLに変換したい。一致するキーはありません。 – OneSource

1

は、HTMLテーブルにあなたの入力を変換XSLT 1.0コードの小さなサンプルです。

<Dataset> 
    <Row> 
    <UnknownCol1 Msg="Data_1_1" /> 
    <UnknownCol2 Msg="Data_1_2" /> 
    <UnknownCol3 Msg="Data_1_3" /> 
    </Row> 
    <Row> 
    <UnknownCol1 /> 
    <UnknownCol2 Msg="Data_2_2" /> 
    <UnknownCol3 Msg="" /> 
    </Row> 
</Dataset> 

この出力が返されます:[スタート] - 未知のノードを通って行く

:これも誰かを助けることができる

<table> 
    <thead> 
    <tr> 
     <th>UnknownCol1</th> 
     <th>UnknownCol2</th> 
     <th>UnknownCol3</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td>Data_1_1</td> 
     <td>Data_1_2</td> 
     <td>Data_1_3</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>Data_2_2</td> 
     <td></td> 
    </tr> 
    </tbody> 
</table> 
1

このサンプル入力に適用

<xsl:template match="Dataset"> 
    <table> 
    <thead> 
     <tr> 
     <xsl:apply-templates select="Row[1]/*" mode="th" /> 
     </tr> 
    </thead> 
    <tbody> 
     <xsl:apply-templates select="Row" /> 
    </tbody> 
    </table> 
</xsl:template> 

<xsl:template match="Row"> 
    <tr> 
    <xsl:apply-templates select="*" mode="td" /> 
    </tr> 
</xsl:template> 

<xsl:template match="Row/*" mode="th"> 
    <th> 
    <xsl:value-of select="local-name()" /> 
    </th> 
</xsl:template> 

<xsl:template match="Row/*" mode="td"> 
    <td> 
    <xsl:value-of select="@Msg" /> 
    </td> 
</xsl:template> 

AMT_を使って空白になっていないか確認してください。

XML:

<INCOME_FARMING_OPERATIONS> 
<PERSONAL_FARMING> 
<IND_SCHEDULE>Y</IND_SCHEDULE> 
<DESCRIPTION>FARMING OPERATIONS</DESCRIPTION> 
<IDENTIFIER>111111111111</IDENTIFIER> 
<AMT_FARM_INC_GROSS>22222222</AMT_FARM_INC_GROSS> 
<AMT_FARM_INC_PARTNER></AMT_FARM_INC_PARTNER> 
<AMT_BAL_LIVESTOCK>99999999</AMT_BAL_LIVESTOCK> 
</PERSONAL_FARMING> 
</INCOME_FARMING_OPERATIONS> 

XSLT

<xsl:variable name ="NodeValueIsEmpty"> 
<xsl:for-each select ="//INCOME_FARMING_OPERATIONS/PERSONAL_FARMING/*[starts-with(name(),'AMT_')]"> 
<xsl:if test ="string-length(.)=0"> 
empty found 
</xsl:if> 
</xsl:for-each> 
</xsl:variable> 
<xsl:value-of select="$IncomeFieldValues"/> 

出力: 空空 のあなたはさらにそれを取ることができるので、見つかりました

<xsl:if test=string-length($NodeValueIsEmpty)>0> 
//todo if any of the AMT_???? fields is not set 
</xsl:if> 
関連する問題