1

XML:

<amenities>
  <record>
    <thekey>77</thekey>
    <thevalue>Balcony</thevalue>
  </record>
  <record>
    <thekey>75</thekey>
    <thevalue>Cable</thevalue>
  </record>
  <record>
    <thekey>35</thekey>
    <thevalue>High Speed Internet</thevalue>
  </record>
  <record>
    <thekey>16</thekey>
    <thevalue>Fireplace</thevalue>
  </record>
  <record>
    <thekey>31</thekey>
    <thevalue>Garage</thevalue>
  </record>
  <record>
    <thekey>32</thekey>
    <thevalue>Phone</thevalue>
  </record>
</amenities>

「35」(高速インターネット)が存在するかどうかを確認するために、アメニティの各レコードをチェックする必要があります。アメニティの記録は異なる場合があります。35(高速インターネット)がある場合とない場合があります。XSLTでこれを確認できるようにする必要があります。

4

2 に答える 2

1

XSLTで条件を記述する方法はいくつかあります。条件に一致するパターンと、条件に一致しないパターンを単純に記述したいように聞こえます。

<xsl:template match="amenities[record[thekey = 35 and thevalue = 'High Speed Internet']]">high speed internet exists</xsl:template>

<xsl:template match="amenities[not(record[thekey = 35 and thevalue = 'High Speed Internet'])]">high speed internet does not exist</xsl:template>

もちろん、amenities要素に一致するテンプレートを作成してから、xsl:ifまたはxsl:choose内部で使用することもできます。

<xsl:template match="amenities">
  <xsl:choose>
     <xsl:when test="record[thekey = 35 and thevalue = 'High Speed Internet']">exists</xsl:when>
     <xsl:otherwise>does not exist</xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2013-01-08T12:29:41.203 に答える
0

最も単純な形式では、この問題の解決策は単一の純粋なXPath式です。

/*/record[thekey = 35 and thevalue = 'High Speed Internet']

recordこれにより、XMLドキュメントの最上位要素の子であり、文字列値を持つ子を持つすべての要素が選択thekeyされます。これは、数値に変換すると35に等しくthevalue、文字列値が文字列「高速インターネット」である子を持つものです。 。

このプロパティを持たないすべてのrecord要素

/*/record[not(thekey = 35 and thevalue = 'High Speed Internet')]

対応するXPath式を(推奨)または命令のselect引数として指定するだけで、これらのノードを処理できます。xsl:apply-templatesxsl:for-each

<xsl:apply-templates select="/*/record[thekey = 35 and thevalue = 'High Speed Internet']"/>

このXPath式から派生した一致パターンでを指定するだけxsl:templateでは、テンプレートが実行用に選択されることをまったく保証しないことに注意してください。これは、テンプレートが適用されたかどうか(明示的または暗黙的)によって異なります。

対象のすべてのノードにアクセスする効率的なXSLTのみの方法は、キーを使用することです。

<xsl:key name="kRecByKeyAndVal" match="record" use="concat(thekey,'+',thevalue)"/>

上記は、要素と子recordの連結に基づいて、すべての要素のインデックスを指定します(これらの値に表示されないことが保証されている適切な区切り文字列('+')によって明確にされます)。thekeythevalue

次に、文字列値が「35」の子と文字列値が「高速インターネット」の子をrecord持つすべての要素thekeythevalueを参照する方法は次のとおりです。

key('kRecByKeyAndVal', '35+High Speed Internet')

キーを使用すると、式を複数回評価する場合に非常に効率(速度)が向上します。

于 2013-01-08T13:11:38.527 に答える