[解決済み] ノードに属性を追加する
2022-02-16 07:18:58
質問
子ノードの値がある文字列と等しい場合、ノードに属性を追加しようとしています。
main.xml ファイルがあります。
<Employees>
<Employee>
<countryid>32</countryid>
<id name="id">1</id>
<firstname >ABC</firstname>
<lastname >XYZ</lastname>
</Employee>
<Employee>
<countryid>100</countryid>
<id name="id">2</id>
<firstname >ddd</firstname>
<lastname >ggg</lastname>
</Employee>
</Employees>
例えば、国のIDが32の場合、Employeeノードにcountry=32という属性を追加します。出力は以下のようになります。
出力.xml
<Employees>
<Employee countryid="32">
<countryid>32</countryid>
<id name="id">1</id>
<firstname >ABC</firstname>
<lastname >XYZ</lastname>
</Employee>
<Employee>
<countryid>100</countryid>
<id name="id">2</id>
<firstname >ddd</firstname>
<lastname >ggg</lastname>
</Employee>
</Employees>
以下のスクリプトを使用していますが、An attribute node cannot be created after children of containing element.というエラーが発生します。
Transform.xsl
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="Employees/Employee/countryid[.=32']">
<xsl:attribute name="countryid">32</xsl:attribute>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
よろしくお願いします。また、カンマで区切られた値としてcountryidを渡すことができます。
ありがとうございます。
解決方法は?
Dimitreの良い答えに加え、XSLT 2.0スタイルシート。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pCountry" select="'32,100'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Employee[countryid = tokenize($pCountry,',')]">
<Employee countryid="{countryid}">
<xsl:apply-templates select="@*|node()"/>
</Employee>
</xsl:template>
</xsl:stylesheet>
出力します。
<Employees>
<Employee countryid="32">
<countryid>32</countryid>
<id name="id">1</id>
<firstname>ABC</firstname>
<lastname>XYZ</lastname>
</Employee>
<Employee countryid="100">
<countryid>100</countryid>
<id name="id">2</id>
<firstname>ddd</firstname>
<lastname>ggg</lastname>
</Employee>
</Employees>
備考 : 配列との比較、パターンでのパラメータ/変数参照は存在します。
その他のアプローチ
countryid
は常に最初の子である。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:param name="pCountry" select="'32,100'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="countryid[. = tokenize($pCountry,',')]">
<xsl:attribute name="countryid">
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
備考
: 現在
xsl:strip-space
の指示は重要です(属性の前に出力されるテキストノードを避けることができます)。
関連
-
[解決済み] XSLT v2.0 を用いて XML ファイルに schemaLocation を挿入する。
-
[解決済み] XSLTで指定された値を持つ要素を数える
-
[解決済み] XSLで親ノードの属性を取得する
-
[解決済み] XSLTにおける分割
-
[解決済み] XSLTで現在の日付を挿入することはできますか?
-
[解決済み] XSLの "contains "ディレクティブはありますか?
-
[解決済み] XSLTで文字列がヌルか空かをチェックする
-
[解決済み】XPathでノードが存在するかどうかを確認する
-
[解決済み] 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 実装 サイバーパンク風ボタン