0

各ノードの上に設定された条件に基づいて返されるタグの数をカウントしたい状況があります。

以下の例に示すように、ほぼ 20 個のフラグがあります。これらのフラグのうちいくつが true になるかはわかりません。Flag が TRUE の場合、カスタム テキストが返されます。返されたフラグの数を知りたいです。変数を使用してさまざまな方法を試しましたが、成功しませんでした。

<!--CPSOR ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CPSORFlag ='true'">                    
  <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>                        
      <xsl:text>CONV PER/SOFF</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>
<!--CERTASADULT ALERT FLAG-->
<xsl:if test="Person/PersonInfo/CertAsAdultFlag ='true'">
   <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:text>CERT ADULT</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>
<!--DECEASED ALERT FLAG-->
<xsl:if test="Person/PersonInfo/DeceasedFlag ='true'">
  <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:text>DECEASED</xsl:text>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:if>

これはサンプル XML です

ここに画像の説明を入力

4

2 に答える 2

1

一般的な問題の典型的な例: 同じ入力データから 2 つの異なる結果を計算したいとします。いくつかのアプローチがあります。

(a) 弾丸を噛み、入力を 2 回処理します。これが james31rock が選んだソリューションです。

(b) (a) と同じですが、複数回評価している式を特定し、これらの式の結果を変数に入れ、計算の繰り返しを避けます。

(c) 最初の計算の結果を変数に入れ、この変数の結果に対して 2 番目の計算を実行します。

私は(b)の線に沿って何かをする傾向があると思います。これは XSLT 2.0 です。あなたが多額のお金を払ってくれる場合のみ、私は XSLT 1.0 を使用します。Person/PersonInfo/CPSORFlagまた、 each のような式は単一のノードを選択すると仮定しています。

<xsl:variable name="flags" select="Person/PersonInfo/(CPSORFlag, CertAsAdultFlag, DeceasedFlag, ....)"/>

<xsl:variable name="count" select="count($flags[.='true'])"/>

<xsl:apply-templates select="$flags[. = 'true']"/>

それから

<xsl:template match="Person/PersonInfo/*" priority="5">
   <scope:PersonAlert>
    <!--PersonAlerts.PersonAlertText-->
    <scope:AlertText>
      <xsl:next-match/>
    </scope:AlertText>
  </scope:PersonAlert>
</xsl:template>

<xsl:template match="CPSORFlag" priority="4">CONV PER/SOFF</xsl:template>
<xsl:template match="CertAsAdultFlag" priority="4">CERT ADULT</xsl:template>
<xsl:template match="DeceasedFlag" priority="4">DECEASED</xsl:template>

etc
于 2012-07-30T22:39:39.763 に答える
0

XMLが次のようになっていると仮定します。

<root>
  <Person>
    <PersonInfo>
      <CPSORFlag>true</CPSORFlag>
    </PersonInfo>
  </Person>
  <Person>
    <PersonInfo>
      <ConditonalReleaseFlag>true</ConditonalReleaseFlag>
    </PersonInfo>
  </Person>
  <Person>
    <PersonInfo>
      <MissingFlag>true</MissingFlag>
    </PersonInfo>
  </Person>
</root>

count()関数を使用する

<NumberOfFlags>
<xsl:value-of select="count(//Person/PersonInfo[CPSORFlag[.='true'] or CPSORFlag[.='true']])"/>
</NumberOfFlags>

また

<NumberOfFlags>
<xsl:value-of select="count(//Person/PersonInfo[CPSORFlag='true' or CPSORFlag='true'])"/>
</NumberOfFlags>

上記のフィルターにさまざまな種類のフラグをすべて追加します

[CPSORFlag='true'など...]

これが証明された例です

フラグの数

編集

新しく貼り付けたXMLを考えると、このテンプレートでうまくいくはずです

XML

 <Person>
    <PersonInfo>
      <CPSORFlag>true</CPSORFlag>
       <MissingFlag>true</MissingFlag>
       <ConditonalReleaseFlag>true</ConditonalReleaseFlag>
    </PersonInfo>
  </Person>

スタイルシート

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="java" version="1.0">
  <xsl:output media-type="text/xml" method="xml"/>
  <!-- Filters refdoc based on condition and  data  -->
  <xsl:template match="/">
    <xsl:apply-templates select="//PersonInfo"/>
  </xsl:template>

  <xsl:template match="PersonInfo">
    <NumberOfFlags>
         <xsl:value-of select="count(CPSORFlag[.='true']|MissingFlag[.='true']|ConditonalReleaseFlag[.='true'])"/>
     </NumberOfFlags>
  </xsl:template>
</xsl:stylesheet>

|で新しいフラグを追加する必要があります カウント関数内の記号

CPSORFlag[。='true']| MissingFlag[。='true']

于 2012-07-30T19:58:53.677 に答える