変換によって生成される要素をカウントしようとしています(XLST1を使用する必要があります)。たとえば、私の変換では次のようになります。
<Parent>
<ElementX Att1="2"/>
<ElementY Att1="1"/>
<ElementZ Att1="6"/>
</Parent>
3つの子要素があるため、同じ変換内で3つを印刷する必要があります。
これはできますか?
ありがとう。
これを行う方法のデモは次のとおりです。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vrtfPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:value-of select="count(ext:node-set($vrtfPass1)/*/*)"/>
</xsl:template>
<xsl:template match="/*">
<Parent>
<ElementX Att1="2"/>
<ElementY Att1="1"/>
<ElementZ Att1="6"/>
</Parent>
</xsl:template>
</xsl:stylesheet>
この変換がXMLドキュメント(このデモでは使用されていません)に適用されると、必要な正しい結果が生成されます。
3
説明:
変換の結果を(単一の変換で)処理する一般的な方法は、最初のパスの結果を変数に保存する2つのパスに編成することです。
2番目のパスでは、結果にアクセスして追加の処理を行います。
XSLT 1.0では、最初のパスの結果をキャプチャする変数が悪名高いRTF(結果ツリーフラグメント)タイプであり、このツリー内のノードにアクセスできるようにするために通常のツリーに変換する必要がある場合(xsl:copy-of
およびstring()
RTFでは引き続き許可されます)。
この通常のツリーへの変換は、拡張関数によって行われます。拡張関数は、ほとんどの場合名前がnode-set
あり、常にベンダー定義の名前空間に属しています。このデモではnode-set()
、EXSLT名前空間に属する拡張関数を使用しています。ほとんどのXSLT1.0プロセッサはEXSLTを実装しているためです。
マルチパス処理の詳細については、次を参照してください。2フェーズ処理:フェーズ1XSLT2.0処理から空のタグを出力しないでください
XSLT の一部を抜粋して提供していただけると、非常に役立ちます。それなしでは XSLT コードを提供することはできません。私は答えにいくつかの「方法」を与えようとします:
解決策の 1 つは、出力をノードセットに格納し (nodeset() 関数を提供する XSLT 1.0 拡張機能を使用)、この変数に XPath count() 関数を適用することです。その後、xsl:value-of を使用して変数を出力するだけで、カウント結果も同じようになります。