[解決済み] XSLTで指定された値を持つ要素を数える
質問
あるXMLファイルの中で、特定の値を持つ要素の数を数える必要があります(一意性を確認するため)。XMLファイルは次のようなものです。
EDIT: 私は元のXMLを更新し、誰かが設計した実際の毛むくじゃらのごちゃごちゃしたものにしました。残念なことに、これを編集しない限り、以前の回答はすべて本当に混乱し、間違っていることになります。
<root>
<ac>
<Properties>
<Property Name="Alive">
<Properties>
<Property Name="ID">
<Properties>
<Property Name="Value">
<long>11007</long>
</Property>
</Properties>
</Property>
</Properties>
</Property>
<Property Name="Dead">
<Properties>
<Property Name="ID">
<Properties>
<Property Name="Value">
<long>11008</long>
</Property>
</Properties>
</Property>
</Properties>
</Property>
...
<Property Name="MostlyDeadAllDay">
<Properties>
<Property Name="ID">
<Properties>
<Property Name="Value">
<long>99001</long>
</Property>
</Properties>
</Property>
</Properties>
</Property>
</Properties>
</ac>
</root>
Alive/Deadレベルのプロパティのうち、テンプレートパラメータで定義された長い値(ID)を持つものがどれだけあるかを見るための変数を定義しようとしています。以下のようなものです(間違っているかもしれませんが)...
<xsl:param name="parPropId"/>
<xsl:variable name="countProperties">
<xsl:value-of select="count(/root/ac/
Properties/Property/
Properties/Property[@Name = 'ID']/
Properites/Property[@Name = 'Value']/long = $parPropId)"/>
</xsl:variable>
ID"レベルで複数のProperty要素を定義することが可能です。しかし、quot;ID"の下にあるProperty要素("Value")は1つだけで、"Value"の下にある要素は1つだけだと考えて間違いないでしょう。
[免責事項] 私が作業に行き詰っているXMLファイル全体を設計した人は、XMLの構造化(例えば、属性と要素の逆方向の使用)を本当に知らなかったのでしょう。その結果、私のXSLTの考え方が一時的にゆがんでしまったのではないかと心配しています。[/disclaimer]
解決するには?
このXPathは
count(//Property[long = '11007'])
と同じ値を返します。
count(//Property/long[text() = '11007'])
...ただし、最初のカウントは
Property
をカウントし、2 番目のカウントは
long
にマッチする子ノードです。
あなたのコメントと質問を何度か読み返したところ、あなたはいくつかの条件を組み合わせて一意性を見つけたいのだと思います。したがって、実際には、複数の条件をチェックしているのだと思います。以下のようにしてもうまくいくと思います。
count(//Property[@Name = 'Alive'][long = '11007'])
と同じ意味だからです。
count(//Property[@Name = 'Alive' and long = '11007'])
もちろん、テンプレート内のパラメータに値を代入することになります。上のコードは、その点を説明したに過ぎません。
EDIT (質問編集後)
XMLがひどいというのは全くその通りでしたね。実際、これは正真正銘の コーディング・ホラー(CodingHorror の候補です。私は現在乗っている "Property" ノードを追跡するために再集計し続けなければなりませんでした。あなたの痛みを感じるよ!
お待たせしました。
count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])
他のチェック(IDやValue)をすべて削除したことに注意してください。XMLの階層構造から関連するノードに到達することができるため、これらは必要ないように思われます。また、一意性のチェックが
long
要素を使用します。
関連
-
[解決済み] XSLT v2.0 を用いて XML ファイルに schemaLocation を挿入する。
-
[解決済み] XSLT <xsl:if> で文字列を比較するときに "not equals to" を指定するにはどうすればよいですか?
-
[解決済み] XSLT : 1から60までのループ処理
-
[解決済み] XSLTにおける分割
-
[解決済み] XSLTで現在の日付を挿入することはできますか?
-
[解決済み] JSONのXSLT対応
-
[解決済み] ベクトル中のxの値を持つ要素の個数を数える
-
[解決済み】配列要素の出現回数/頻度を数える
-
[解決済み】XSLTで を挿入する方法
-
[解決済み] xsltのtest属性に2つの条件を入れることはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] XSLT <xsl:if> で文字列を比較するときに "not equals to" を指定するにはどうすればよいですか?
-
[解決済み] XSLTで指定された値を持つ要素を数える
-
[解決済み] XSLT : 1から60までのループ処理
-
[解決済み] XSLで親ノードの属性を取得する
-
[解決済み] ノードに属性を追加する
-
[解決済み] XSLTにおける分割
-
[解決済み] XSLの "contains "ディレクティブはありますか?
-
[解決済み] XSLTで文字列がヌルか空かをチェックする
-
[解決済み】XPathでノードが存在するかどうかを確認する
-
[解決済み] XSLTで最後の要素を取得する