0

前回の記事の Tim の助けを借りて、Muenchian のグループ化をテスト用の xml/xsl で機能させることができました。しかし、実際の xml を操作しているときに、以下のような別のシナリオに遭遇しました。入力xmlは次のように見えますが、簡単にするために縮小しています。ご覧のとおり<name>Status</name> <value>Existing</value>、実際の xml には他にも多くのエントリがあります。

<message>
<requisition>
<data-values>
    <data-value multi-valued="false">
        <name>Test_Grid-1.Name</name> <value>1</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-1.SupportType</name> <value>Monthly,Quarterly</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-2.Name</name> <value>2</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-2.SupportType</name> <value>Monthly</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Status</name> <value>Existing</value>
    </data-value>
</data-values>
</requisition>
<agent-parameter multi-valued="false">
  <name>ActionType</name> <value>New</value>
</agent-parameter>
<agent-parameter multi-valued="false">
  <name>Dictionary</name> <value>Test_Grid</value>
</agent-parameter>
<agent-parameter multi-valued="false">
  <name>ActionName</name> <value>SupportData</value>
</agent-parameter>
</message>

私が使用しているXSLは次のとおりです。

<xsl:key name="record" match="data-value" use="substring-before(name, '.')" />

<xsl:template match="message">
  <record>
    <xsl:apply-templates select="//data-value[generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" mode="record" />
  </record>
</xsl:template>
<xsl:template match="data-value" mode="record">
<rowData>
  <name><xsl:value-of select="$ServiceItemName" /></name>
 <xsl:apply-templates select="key('record', substring-before(name, '.'))" />
</rowData>
</xsl:template>

<xsl:template match="data-value">
 <xsl:if test="starts-with(name,concat($Dictionary,'-'))">
   <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" />   </rowAttribute>
 </xsl:if>
</xsl:template>

実際の入力 xml には、さまざまなデータ値 (Test_Grid-1 または Test_Grid-2 など以外) が含まれています。そのシナリオでは、xsl はこれらすべての要素を引き出し、内部に表示しています。「Test_Grid-」で始まる値のみをフィルタリングする方法はありますか (名前Dictionaryと値が「Test_Grid」のエージェントパラメーターがあります)、xsl は名前が始まるデータ値のみをプルします-with concat($Dictionary,'-')。私は以下のようなものを試しました

       <xsl:template match="data-value">
    <xsl:if test="starts-with(name,concat($Dictionary,'-'))">
        <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" /></rowAttribute>
    </xsl:if>

ただし、必要な出力とともに、以下のような出力に空の要素が表示されます。

 <record>
            <name>SupportData</ext:name>
 </record>
 <record>
              <name>SupportData</name>
    <rowData>
              <rowAttribute name="Name">Record1</rowAttribute>
              <rowAttribute name="SupportType">Quarterly</rowAttribute>
    </rowData>        
 </record>

いくつかの行データ要素が含まれている場合にのみ要素を表示できる方法はありますか?

ありとあらゆる助けが本当に感謝されます。

4

1 に答える 1

1

名前が「Test_Grid-」で始まらないデータ値要素を無視するには、xpath 関数「starts-with」を使用できます。xpath 式に条件を追加して、データ値要素をフィルタリングできます。

data-value[starts-with(name, 'Test_Grid-')]

実際には、これをdata-valueのxsl:keyマッチ、またはそれらを選択するxsl:apply-templatesに追加できます。たとえば、次のいずれかを実行できます。

<xsl:key name="record" match="data-value[starts-with(name, 'Test_Grid-')]" use="substring-before(name, '.')" />

または、これを行うこともできます

<xsl:apply-templates 
    select="requisition/data-values/data-value
       [starts-with(name, 'Test_Grid-')]
       [generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" 
    mode="record" />

キーの一部として配置する方が効率的かもしれません。これをキーの一部として配置することで、個別の要素のチェックで「Test-Grid-」で始まる要素のみが考慮されます。

于 2013-09-22T10:08:03.040 に答える