开发者

Create a list/array in XSLT

I have the following scenario. I have a list of countries (EG, KSA, UAE, AG)

I need to check an XML input if it is contained in this list or not:

<xsl:variable name="$cou开发者_运维百科ntry" select="Request/country" >

<!-- now I need to declare the list of countries here -->

<xsl:choose>
 <!-- need to check if this list contains the country -->
 <xsl:when test="$country='??????'">
   <xsl:text>IN</xsl:text>
 </xsl:when>
 <xsl:otherwise>
   <xsl:text>OUT</xsl:text>
 </xsl:otherwise>
</xsl:choose>

Note: I am using XSLT 1.0.


<xsl:variable name="$country" select="Request/country"/>
<xsl:variable name="countries">|EG|KSA|UAE|AG|</xsl:variable>

<xsl:when test="contains($countries,$country)">...</xsl:when>


EDIT

Upon reading your post again, I think the original version of my answer (below) is not it.

You have a list already - your variable declaration selects a node-set of all <country> nodes that are children of <Request> (a node-set is the XSLT equivalent of an array/a list):

<xsl:variable name="$country" select="Request/country" >

But the point is, you don't even need that list as a separate variable; all you need is:

<xsl:when test="Request[country=$country]"><!-- … --></xsl:when>

Where Request[country=$country] reads as "Within <Request>, look at every <country> and select it if it is equal to $country." When the expression returns a non-empty node-set, $country is in the list.

Which is, in fact, what Rubens Farias said from the start. :)


Original answer, kept for the record.

If by "list" you mean a comma-separated string of tokens:

<!-- instead of a variable, this could be a param or dynamically calculated -->
<xsl:variable name="countries" select="'EG, KSA, UAE, AG'" />
<xsl:variable name="country"   select="'KSA'" />

<xsl:choose>
  <!-- concat the separator to start and end to ensure unambiguous matching -->
  <xsl:when test="
    contains(
      concat(', ', normalize-space($countries), ', ')
      concat(', ', $country, ', ')
    )
  ">
    <xsl:text>IN</xsl:text>
  </xsl:when>
  <xsl:otherwise>
    <xsl:text>OUT</xsl:text>
  </xsl:otherwise>
</xsl:choose>


Try something like, if your country list belongs on your XML input:

<xsl:when test="/yourlist[country = $country]'">

Or, if that's static, you could go with:

<xsl:when test="$country = 'EG' or $country = 'KSA' or ...">


I am modifying sam's answer,

you can create a variable which is pipe separated as a string (not a list but act as list), country codes are unique so contains method works fine

but for the similar name variables consider 'Product', 'ProductType' and 'ProductItem' present as countries parameter then it will not work ie if condition fails as contains method check string is present in the provided string,

So my suggestion is to add separators also along with the name ie concat to work contains as search criteria.

    <xsl:variable name="$country" select="Request/country"/>
    <xsl:variable name="countries">|EG|KSA|UAE|AG|</xsl:variable>

    <xsl:when test="contains($countries,concat('|',$country,'|')">
        your logic goes here....
    </xsl:when>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜