2009-09-18 2 views
4

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

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

Есть ли способ, что я могу проверить это с помощью XSL

вход выглядит следующим образом:

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

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

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

Спасибо,

Марка

+0

@Kitemark: Строго говоря, ни проверка, ни схема XML не связаны с вопросом. Я предпочитаю удалять эти теги. – Tomalak

ответ

3

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

<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. Это легкая часть.

+0

Хотя я действительно ценю, что вы принимаете мой ответ, Китемарк, я считаю, что ответ Томалака превосходит мой. Я бы посоветовал следовать его решению, а не моему в этой ситуации. – Welbog

2
<!-- 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() = '') 
] 
+0

О, ты подлый Томалак. Кажется, это ужасный клоч, способ подсчитать вещи. – Welbog

+0

Даже подлый. +1 для того, чтобы не использовать kludge. – Welbog

+0

Да, я сразу понял, насколько глупой версией № 1 было, но не удалось переписать в течение этого страшного 5-минутного периода. :-D Спасибо за голосование. ;-) – Tomalak

 Смежные вопросы

  • Нет связанных вопросов^_^