0

xslt 2.0 を使用して Saxon-ce で ixsl:eval() を使用して動的 xpath を評価しようとしていますが、機能していないようです。これが例示的なXMLです

<things>
  <thing>
    <name>widget one</name>
    <number>10</number>
    <type>metal</type>
    <subtypes>
      <subtype>red<subtype>
    </subtypes>
  </thing>
  <thing>
    <name>widget two</name>
    <number>11</number>
    <type>wood</type>
    <subtypes>
      <subtype>red</subtype>
      <subtype>blue</subtype>
    </subtypes>
  </thing>
</things>

そして、私が評価しようとしているxsl 2.0スタイルシートの一部(さまざまなパラメータが、より大きなxslスタイルシートの別の部分によって渡されます)

<template name="display" match="things">
  <xsl:param name="num"/>
  <xsl:param name="type" as="xs:string"/>
  <xsl:param name="subtype" as="xs:string"/>

  <xsl:variable name="xpathExp" as="xs:string">
     <xsl:text>things/thing</xsl:text>
     <xsl:if test="not($num = 'all')>
       <xsl:copy-of select="concat('[number=',$num,']')"/>
     </xsl:if>
     <xsl:if test="not($type = 'all')>
        <xsl:copy-of select="concat('[type=''',$type,''']')"/>
     </xsl:if>
     <xsl:if test="note($subtype = 'all')>
         <xsl:copy-of select="concat('[subtype/subtypes=''',$subtype,''']')/>
     </xsl:if>
   </xsl:variable>

   <xsl:result-document href="#display" method="ixsl:replace-content">

   <xsl:for-each select="ixsl:eval($xpathExp)">
      <xsl:sort select="name"/>
   </xsl:for-each>

</template>

eval ステートメントを明示的な xpath ステートメントに置き換えると、コードが機能するため、何らかの理由で $xpathExp の eval が機能しません。アイデア?

* 編集 * これはより良い XML の例です:

<things>
  <thing>
    <name>widget one</name>
    <number>10</number>
    <type>metal</type>
    <subtypes>
      <subtype>red<subtype>
    </subtypes>
  </thing>
  <thing>
    <name>widget two</name>
    <number>11</number>
    <type>wood</type>
    <subtypes>
      <subtype>red</subtype>
      <subtype>blue</subtype>
    </subtypes>
  </thing>
  <thing>
    <name>widget three</name>
    <number>11</number>
    <type>metal</type>
    <subtypes>
      <subtype>blue</subtype>
    </subtypes>
  </thing>
</things>

ユーザーは、数値、タイプ、およびサブタイプのドロップボックスを介して値を選択できます。ユーザーの選択に応じて、モノの名前のリストが表示されます。たとえば、ユーザーが数字の 11 とサブタイプの赤を選択すると、ウィジェット 2 が表示されます。代わりに青のサブタイプを選択すると、ウィジェット 2 と 3 の名前が表示されます。

したがって、基本の xpath フィルターは things/thing です。ユーザーが数値を選択した場合、xpath 式に [number=$num] を追加したいので、ti は things/thing[number=$num] になります。彼らが複数のアイテムを選択した場合、たとえば番号とタイプ、[number=$num][type=$type] がベース xpath に追加され、things/thing[number=$num][type=$] が追加されますタイプ]。

基本的に私が避けようとしているのは、可能なすべての順列と可能なユーザー選択の組み合わせを個別にコーディングする必要があることです。

それは役に立ちますか?

4

1 に答える 1

0

ixsl :eval関数は、XPath ではなく、JavaScript の動的評価用です。サクソンCEのドキュメントから:

...文字列として指定された Javascript コードを実行します。提供されたスクリプトは、すぐに評価されて結果を返す関数として DOM に挿入されます。

提供するコード サンプルでは、​​動的評価は必要ありません。XSLT アプリケーションの特定のクラスのみが、動的 XPath 評価を実際に必要とします。

動的な XPath 評価が必要となるまれなケースでは、Saxon-CE には組み込み機能がないため、XPath を動的に構築する代わりに、単純な「ラッパー」XSLT を生成し、Saxon-CE JavaSCript を使用してこれを実行する必要があります。 API。この手法は、PathEnqオンライン XPath 2.0 エバリュエーターで使用されます。

次のコードは、単一の「静的」XPath 式を使用してコードに似たものを実現します。この例では、必要な「thing」要素にさらにテンプレートを適用して、使用可能な HTML を作成します。

レンダリングされたコード (構文が強調表示され、フォーマットされている)

ここに画像の説明を入力

ソースコード:

<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT"
xmlns:js="http://saxonica.com/ns/globalJS"
xmlns:prop="http://saxonica.com/ns/html-property"
xmlns:style="http://saxonica.com/ns/html-style-property"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs prop"
extension-element-prefixes="ixsl"
version="2.0"
>
<xsl:template name="main" match="/">
<xsl:call-template name="display"/>
</xsl:template>

<xsl:template name="display">
<xsl:param name="num" as="xs:string" select="'none'"/>
<xsl:param name="type" as="xs:string" select="'all'"/>
<xsl:param name="subtype" as="xs:string" select="'red'"/>

<xsl:variable name="thingsEl" select="things" as="element(things)"/>

<xsl:variable name="widget" as="element()+"
select="if ($num eq 'all')
then $thingsEl/thing[number = $num]
else if ($type ne 'all')
    then $thingsEl/thing[type = $type]
else $thingsEl/thing[subtypes/subtype = $subtype]"/>

<xsl:result-document href="#display" method="append-content">
<xsl:apply-templates select="$widget">
<xsl:sort select="name"/>
</xsl:apply-templates>
</xsl:result-document>

</xsl:template>

<xsl:template match="thing">
<ol>
<li>name: <xsl:value-of select="name"/></li>
<li>number: <xsl:value-of select="number"/></li>
<li>type: <xsl:value-of select="type"/></li>
<li>subtypes: 
<ol>
<xsl:apply-templates select="subtypes/subtype"/>
</ol>
</li>
</ol>
</xsl:template>

<xsl:template match="subtype">
<li><xsl:value-of select="."/></li>
</xsl:template>

</xsl:transform>

HTML 出力 ('display' div 要素の外部 HTML ビュー)

<div id="display">
    <ol>
        <li>name: widget one</li>
        <li>number: 10</li>
        <li>type: metal</li>
        <li>subtypes: 
            <ol>
                <li>red</li>
            </ol></li>
    </ol>
    <ol>
        <li>name: widget two</li>
        <li>number: 11</li>
        <li>type: wood</li>
        <li>subtypes: 
            <ol>
                <li>red</li>
                <li>blue</li>
            </ol></li>
    </ol>
</div>
于 2013-01-22T17:41:25.840 に答える