0

XML データをループして、XML 入力の部分文字列がパラメーター TagIDs に含まれているかどうかを判断しようとしています。入力の例を次に示します。

 <in:inputs xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
<!-- Input Parameter, XPath /in:inputs/in:param[@name='TagTypeCode'] -->
<in:param name="TagTypeCode">USC_CATEGORY_tags</in:param>
<!-- Input Parameter, XPath /in:inputs/in:param[@name='keyword'] -->
<in:param name="keyword"/>
<!-- Input Parameter, XPath /in:inputs/in:param[@name='TagIDs'] -->
<in:param name="TagIDs">,2704,2764,</in:param>
<!-- Function Call Result (2 ms), XPath /in:inputs/in:result[@name='SolrSearchResults']/response -->
 <in:result name="SolrSearchResults">
     <response xmlns="">
         <lst name="responseHeader">
            <int name="status">0</int>
            <int name="QTime">1</int>
             <lst name="params">
                <str name="facet">true</str>
                <str name="start">0</str>
                <str name="q">*:* AND tagids:2704 AND tagids:2764</str>
                <str name="facet.field">USC_CATEGORY_tags</str>
                <str name="rows">0</str>
            </lst>
        </lst>
        <result name="response" numFound="0" start="0"/>
         <lst name="facet_counts">
            <lst name="facet_queries"/>
             <lst name="facet_fields">
                 <lst name="USC_CATEGORY_tags">
                    <int name="2703.Best Sellers">0</int>
                    <int name="2704.New Release">0</int>
                    <int name="2705.Training Products">0</int>
                    <int name="2706.AICP Exam Prep">0</int>
                    <int name="2707.PAS Reports">0</int>
                    <int name="2709.PAS Super Sale">0</int>
                    <int name="2722.Books Big Sale 2013">0</int>
                    <int name="2723.Books Big Sale 2013 - 20% Off">0</int>
                    <int name="2724.Books Big Sale 2013 - 50% Off">0</int>
                    <int name="2725.Books Big Sale 2013 - 80% Off">0</int>
                    <int name="2734.eBook Landing Page">0</int>
                    <int name="2736.eBook Landing Page">0</int>
                </lst>
            </lst>
            <lst name="facet_dates"/>
            <lst name="facet_ranges"/>
        </lst>
    </response>
</in:result>

/in:inputs/in:result[@name='SolrSearchResults']/response/lst[@name='facet_counts']/lst[@name='facet_fields']/lst/int をループして判断することは可能ですか? @name 属性 ('.' の前の部分文字列) が TagIDs パラメータに含まれている場合、変数に何らかの値を設定しますか? 最も効率的な方法は何ですか?

これが私が試したことです

<xsl:variable name="root" select="/in:inputs/in:result[@name='SolrSearchResults']/response" />
    <xsl:variable name="TagIDs" select="/in:inputs/in:param[@name='TagIDs']" />
    <xsl:variable name="facet_selected" select="0"/>

<xsl:for-each select="$root/lst[@name='facet_counts']/lst[@name='facet_fields']/lst/int">
            <xsl:if test="contains($TagIDs,concat(',',substring-before(@name,'.'),','))" >
                <xsl:variable name="facet_selected" select="1" />
            </xsl:if>
        </xsl:for-each>

正しい方向に向けていただければ幸いです。

4

1 に答える 1

1

はい、次のようにできます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:variable name="root"
                  select="/in:inputs/in:result[@name='SolrSearchResults']
                                    /response" />
    <xsl:variable name="TagIDs"
                  select="/in:inputs/in:param[@name='TagIDs']" />
    <xsl:variable name="ints"
                  select="$root/lst[@name='facet_counts']
                               /lst[@name='facet_fields']/lst/int" />

    <xsl:variable name="matchingInts"
                  select="$ints[contains($TagIDs, 
                                         concat(',', 
                                                substring-before(@name, '.'), 
                                                ',')
                                        )]" />
    <!-- facet_selected will have the value 1 if matches were found, 0 if not -->
    <xsl:variable name="facet_selected" select="number(boolean($matchingInts))"/>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、 with namematchingIntsが含まれ、値が 1 になります。int2704.New Releasefacet_selected

于 2013-11-12T09:40:11.403 に答える