特定の条件が満たされている場合、XSLTを使用してノードを1レベル上に移動する方法を知りたいと思います。あなたに例を挙げてみると、次のXMLソースを見てください。XSLT:ノードを1レベル上に移動
<Settings>
<String [...]>
<Boolean [...]/>
</String>
</Settings>
これは、私が開始状況として持っているXMLです。明確にするために、ノード名 "Settings"、 "String"、 "Boolean"は、定義した特別なノードです。
問題は、 "ブール"ノードが "文字列"ノードの内部で使用できないことです。だからこそ私はそれらの "ブール"ノードをレベルアップさせる必要があります。希望XMLは次のようになります。
<Settings>
<String [...]></String>
<Boolean [...]/>
</Settings>
XSLTにもかかわらず、XMLツリー内の位置の、兄弟ブールノードを持つすべての文字列のノードで動作するように持っています。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<!-- Identity rule -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- special rules ... -->
</xsl:stylesheet>
を私は苦労していなことがある:
は、これまでのところ私は、あなたが最初に目的の変換のためにいくつかの特別なルールを適用し、「アイデンティティのルール」を使用してXMLのすべてをコピーしなければならないことを学びましたルールを使用して、「文字列」ノードの兄弟であるすべての「ブール」ノードを1レベル上に移動します。どうやってやるの?!?
良い質問、+1。 "アイデンティティルールを上書きする"デザインパターンのバリエーションについては、私の答えを見てください - 私は少し正確なオーバーライドを提供しました。 :) –