Проверка того, что по крайней мере 2 из 5 строк существуют на адресе в XSL 1.0, перед выводом узла адреса - PullRequest
4 голосов
/ 18 сентября 2009

Я пытаюсь создать адрес, который проверяет соответствие схеме, установленной в камне, требует, чтобы было введено как минимум 2 из 5 строк.

Показывать адресный узел, только если доступны хотя бы две из пяти строк.

Есть ли способ проверить это с помощью XSL

Вход выглядит так:

<Services Street="1 The Road " ExtraAddress="The Street" 
VillageTownName="" PostalTownName="" County="">

Требуемый действительный вывод

<Address>
<line>1 The Road</line>
<line>The Street</line
</Address>

Спасибо

Mark

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Подсчитайте все атрибуты, которые имеют значения, и используйте их для проверки:

  <xsl:template match="Services">
    <xsl:variable name="line-count"
       select="count(
      ./@*[(name() = 'Street' 
      or name() = 'ExtraAddress'
      or name() = 'VillageTownName'
      or name() = 'PostalTownName'
      or name() = 'County')
      and string-length(.) &gt; 0]
     )"
  />
    <xsl:choose>
      <xsl:when test="$line-count &gt; 1">
        <xsl:text>Valid</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>Invalid</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Если это единственные атрибуты, которые могут появляться в элементе Services, то вы можете удалить явные проверки имен и использовать вместо них @* в качестве селектора.

Я проверил это с помощью XSLT 1.0, и он отлично работает.

Вам потребуется поместить элемент apply-template вместо моего элемента text в допустимом регистре, чтобы напечатать элемент address. Это легкая часть.

2 голосов
/ 18 сентября 2009
<!-- this outputs an <Address> element if appropriate -->
<xsl:template match="Services">
  <xsl:variable name="lines" select="@*[not(normalize-space() = '')]" />
  <xsl:if test="count($lines) &gt;= 2">
    <Address>
      <xsl:apply-templates select="$lines" />
    </Address>
  </xsl:if>
</xsl:template>

<!-- this outputs the individual address lines -->
<xsl:template match="Services/@*">
  <line>
    <xsl:value-of select="." />
  </line>
</xsl:template>

Выражение @*[not(normalize-space() = '')] фактически подразумевает, что каждый атрибут элемента <Service> является релевантным. Если вы хотите / должны сделать это более явным, я предлагаю:

(@Street|@ExtraAddress|@VillageTownName|@PostalTownName|@County)[
  not(normalize-space() = '')
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...