値からノードセットを作成するにはどうすればよいですか。
私はn個の番号1、2、3.......nを持っています。
ノードセットを作成したい
<MYNMUMS>
<MYNUM>1</MYNUM>
<MYNUM>2</MYNUM>
<MYNUM>3</MYNUM>
<MYNUM>4</MYNUM>
....
<MYNUM>N</MYNUM>
</MYNMUMS>
値からノードセットを作成するにはどうすればよいですか。
私はn個の番号1、2、3.......nを持っています。
ノードセットを作成したい
<MYNMUMS>
<MYNUM>1</MYNUM>
<MYNUM>2</MYNUM>
<MYNUM>3</MYNUM>
<MYNUM>4</MYNUM>
....
<MYNUM>N</MYNUM>
</MYNMUMS>
それと同じくらい簡単:
XSLT 1.0ソリューション:
この変換:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<MyNums>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="1"/>
<xsl:with-param name="pEnd" select="10"/>
</xsl:call-template>
</MyNums>
</xsl:template>
<xsl:template name="generateNumNodes">
<xsl:param name="pStart"/>
<xsl:param name="pEnd"/>
<xsl:if test="$pEnd >= $pStart">
<xsl:variable name="vNumNodes"
select="$pStart -$pEnd+1"/>
<xsl:choose>
<xsl:when test="$vNumNodes = 1">
<MyNum><xsl:value-of select="$pStart"/></MyNum>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vHalf" select=
"floor(($pStart+$pEnd) div 2)"/>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="$pStart"/>
<xsl:with-param name="pEnd" select="$vHalf"/>
</xsl:call-template>
<xsl:call-template name="generateNumNodes">
<xsl:with-param name="pStart" select="$vHalf+1"/>
<xsl:with-param name="pEnd" select="$pEnd"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
XMLドキュメント(未使用)に適用すると、目的の出力が生成されます。
<MyNums>
<MyNum>1</MyNum>
<MyNum>2</MyNum>
<MyNum>3</MyNum>
<MyNum>4</MyNum>
<MyNum>5</MyNum>
<MyNum>6</MyNum>
<MyNum>7</MyNum>
<MyNum>8</MyNum>
<MyNum>9</MyNum>
<MyNum>10</MyNum>
</MyNums>
次の点に注意してください。
テンプレート generateNumNodes
はそれ自体を再帰的に呼び出します。
この再帰は時間( O(N) )
とスペースの両方で( O(log2(N)) )
効率的であり、実際にはスタックをオーバーフローします-ここではそうはいきません!
上記の機能は、DVC(DiVide and Conquer
)スタイルで再帰を実装することで実現されます。
tail-recursion
準拠しているXSLTプロセッサで正常に実行されるのとは異なります。
1000000(100万個の数値)を生成するために必要な最大再帰深度はわずか19です。
XSLT 2.0ソリューション:
XPath 2.0to
演算子を使用するだけで、さらに基本的な再帰はありません。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<MyNums>
<xsl:for-each select="1 to 10">
<MyNums>
<xsl:sequence select="."/>
</MyNums>
</xsl:for-each>
</MyNums>
</xsl:template>
</xsl:stylesheet>
XSLTは変換言語です。これは通常、XMLドキュメントの形式のデータがすでにあり、別のドキュメント(XML形式の場合とそうでない場合があります)に変換する場合に使用されます。
「生」データから始めてXML表現を生成するタスクには、XSLTは適していません。
これを解決するには、さまざまな言語を調べることをお勧めします。