Значение переменной по умолчанию XSLT, если значение отсутствует - PullRequest
8 голосов
/ 14 ноября 2011

Я пытаюсь объявить переменную, которая имеет значение по умолчанию или если значение присутствует в повторяющемся наборе, чтобы использовать новое другое значение.

Это то, что я имею до сих пор.

      <xsl:variable name="lsind">
        <xsl:value-of select="'N'"/>

        <xsl:for-each select='./Plan/InvestmentStrategy/FundSplit'>
          <xsl:choose>
            <xsl:when test="contains(./@FundName, 'Lifestyle')">
              <xsl:value-of select="'Y'"/>
            </xsl:when>
          </xsl:choose>
        </xsl:for-each>
      </xsl:variable>

Что мне нужно, так это если в каких-либо случаях ./Plan/InvestmentStrategy/FundSplit/@FundName 'содержится' LifeStyle, а затем lsind 'Y', в противном случае он возвращается к значению по умолчанию 'N'.* Я делаю это так, как будто я использую ', иначе последнее вхождение может потенциально установить lsind обратно в N?

Есть предложения?

Ответы [ 2 ]

13 голосов
/ 14 ноября 2011
<xsl:variable name="lsind">
  <xsl:choose>
    <xsl:when test="Plan/InvestmentStrategy/FundSplit[contains(@FundName, 'Lifestyle')]">
       <xsl:text>Y</xsl:text>
    </xsl:when>
    <xsl:otherwise>
       <xsl:text>N</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

должно хватить

5 голосов
/ 14 ноября 2011

Это можно указать в одном выражении XPath (даже в XPath 1.0):

 <xsl:variable name="vLsind" select=
 "substring('YN',
             2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']),
             1)"/>

Пример 1 :

<plan>
 <InvestmentStrategy>
  <FundSplit FundName="Lifestyle"/>
 </InvestmentStrategy>
</plan>

Преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vLsind" select=
 "substring('YN',
             2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']),
             1)"/>

 <xsl:template match="/">
   <xsl:value-of select="$vLsind"/>
 </xsl:template>
</xsl:stylesheet>

Результат :

Y

Пример 2 :

<plan>
 <InvestmentStrategy>
  <FundSplit FundName="No Lifestyle"/>
 </InvestmentStrategy>
</plan>

Результат :

N

Пояснение :

  1. По определению boolean(some-node-set) равно true()точно, когда some-node-set не пусто.

  2. По определению number(true()) равно 1, а number(false()) равно 0

  3. 1 и 2 в совокупности дают нам: number(boolean(some-node-set)) равно 1 именно тогда, когда some-node-set не пусто, в противном случае это 0.

Другие одно-Решения для выражения :

XPath 1.0 :

translate(number(boolean(YourXPathExpression)), '10', 'YN')

XPath 2.0 :

if(YourXPathExpression)
 then 'Y'
 else 'N'

Или даже :

 ('N', 'Y')[number(boolean(YourXPathExpression)) +1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...