1

変換によって生成される要素をカウントしようとしています(XLST1を使用する必要があります)。たとえば、私の変換では次のようになります。

<Parent>
  <ElementX Att1="2"/>
  <ElementY Att1="1"/>
  <ElementZ Att1="6"/>
</Parent>

3つの子要素があるため、同じ変換内で3つを印刷する必要があります。

これはできますか?

ありがとう。

4

2 に答える 2

0

これを行う方法のデモは次のとおりです。

<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処理から空のタグを出力しないでください

于 2013-03-21T03:14:15.703 に答える
0

XSLT の一部を抜粋して提供していただけると、非常に役立ちます。それなしでは XSLT コードを提供することはできません。私は答えにいくつかの「方法」を与えようとします:

解決策の 1 つは、出力をノードセットに格納し (nodeset() 関数を提供する XSLT 1.0 拡張機能を使用)、この変数に XPath count() 関数を適用することです。その後、xsl:value-of を使用して変数を出力するだけで、カウント結果も同じようになります。

于 2013-03-21T00:48:04.360 に答える