以前は XSLT をしたことがありませんでした。ドキュメントを継承して 1 つのタグだけを置き換えることは可能ですか? はいの場合、例を教えてください。
ありがとうございました
以前は XSLT をしたことがありませんでした。ドキュメントを継承して 1 つのタグだけを置き換えることは可能ですか? はいの場合、例を教えてください。
ありがとうございました
テンプレートから始めます
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
次に、変換したいノードを変換するためのテンプレートを追加します。
<xsl:template match="td">
<th>
<xsl:apply-templates select="@* | node()"/>
</th>
<xsl:template>
すべてのtd
要素をth
要素に変換するか、
<xsl:template match="h6"/>
h6
すべての要素を削除します。
単一のものを変換したい場合は、それを識別する方法が必要です。属性が次のような一致パターンを使用td
していると仮定しますid
<xsl:template match="td[@id = 'td1']">
<td style="background-color: lightgreen;">
<xsl:apply-templates select="@* | node()"/>
</td>
</xsl:template>
そのサンプルは、特定の要素の CSSbackground-color
プロパティを設定します。td
このタスクは、最も基本的な XSLT デザイン パターンである同一性規則の使用とオーバーライドで処理するのが最適です。
次の XML ドキュメントを用意してみましょう。
<root>
<x>This is:</x>
<a>
<b>
<c>hello</c>
</b>
</a>
<a>
<b>
<c1>world</c1>
</b>
</a>
<a>
<b>!</b>
</a>
<y>The End</y>
</root>
タスクは次のとおりです。
c
すべての要素を削除します。
b
要素の名前を に変更しd
ます。
c2
任意の要素の後に要素を挿入しc1
ます。
ソリューションは驚くほど短くてシンプルです。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c"/>
<xsl:template match="b">
<d><xsl:apply-templates select="node()|@*"/></d>
</xsl:template>
<xsl:template match="c1">
<xsl:call-template name="identity"/>
<c2>xxx</c2>
</xsl:template>
</xsl:stylesheet>
この変換を上記の XML ドキュメントに適用すると、必要な正しい結果が生成されます。
<root>
<x>This is:</x>
<a>
<d/>
</a>
<a>
<d>
<c1>world</c1>
<c2>xxx</c2>
</d>
</a>
<a>
<d>!</d>
</a>
<y>The End</y>
</root>
説明:
ID テンプレートは、実行のために選択されるか、名前で呼び出されると、現在のノードを「そのまま」コピーします。
特別なタスク (削除、挿入、名前の変更) ごとに、必要なノードに一致する別のテンプレートを追加し、より高い特異性のために ID テンプレートをオーバーライドします。
オーバーライドするより具体的なテンプレートは、一致するノードで実行するために選択され、実行する必要があるタスクを実行します。