以前は 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 テンプレートをオーバーライドします。
オーバーライドするより具体的なテンプレートは、一致するノードで実行するために選択され、実行する必要があるタスクを実行します。