Как выбрать условие в xslt, если атрибут существует в ссылочном url в xml?

#xml #xslt #xslt-2.0

#xml #xslt #xslt-2.0

Вопрос:

У меня есть некоторый написанный код и XML, как указано здесь:

 <section label="docs">
        <presentation>
          <mini-site title="Documents"/>
          <power-page title="Product Documents"/>
        </presentation>
        <content template="document-gallery">
          <document lanuage="en" ref="http://manuals.frigidaire.com/prodinfo_pdf/Springfield/TIMSEB471MRR1en.pdf" title="Complete Owner's Guide"/>
          <document lanuage="en" ref="http://manuals.frigidaire.com/prodinfo_pdf/Springfield/5995709499.pdf" title="Wiring Diagram"/>
          <document lanuage="en, es, fr" ref="http://manuals.frigidaire.com/prodinfo_pdf/Springfield/TINSEB472MRR0.pdf" title="Installation Instructions"/>
          <document lanuage="en" ref="http://manuals.frigidaire.com/prodinfo_pdf/Specsheets/E30MO65GSS_1213_EN.pdf" title="Product Specifications Sheet"/>
        </content>
      </section>
  

В URL «ref» он заканчивается на «en.pdf» и language=»en».
Я хочу выбрать те PDF, у которых есть lanuage =»en», а ссылка заканчивается на «en.pdf».

Вот что я написал:

 <xsl:template match="document">
    <xsl:if test="select[(@lanuage,'en') and ends-with(@ref,'en.pdf')]">
        <xsl:variable name="href" select="js:call($resource-to-collect,string(@ref))"/>
        <a type="{name()}" href="{$href}"><xsl:apply-templates select="@* except(@ref)"/><xsl:apply-templates select="node()"/></a>
    </xsl:if>
</xsl:template>
  

Но это дает мне вывод, который имеет lanuage = «en», пожалуйста, предложите мне это.

Комментарии:

1. Это выдаст точное, в соответствии с условием, которое вы ищете, значение @language равно ‘en’

2. не могли бы вы, пожалуйста, сообщить мне, как я могу удовлетворить оба условия

3. Вы уверены, что ваш текущий XSLT выводит что-нибудь? Выражение select[(@lanuage,'en') and ends-with(@ref,'en.pdf')] ищет вызываемый дочерний узел select , которого не существует в вашем XML, и поэтому условие всегда будет false. В этом примере я ожидал бы, что это будет <xsl:if test="@language = 'en' and ends-with(@ref, 'en.pdf')">

4. Если, если он не содержит lanuage атрибута, тогда вам нужно использовать «или»не «и»здесь. <xsl:if test="@lanuage='en' or ends-with(@ref,'en.pdf')"> . Или, может быть <xsl:if test="contains(@lanuage, 'en') or ends-with(@ref,'en.pdf')"> , если вы хотите включить тот, с lanuage="en, es, fr"

5. Обратите также внимание, что XML чувствителен к регистру: E30MO65GSS_1213_EN.pdf не заканчивается на en.pdf .

Ответ №1:

Привет, Бриджеш, попробуй этот код:

     <xsl:template match="document">
    <xsl:if test="(@lanuage[.]='en') and (ends-with(lower-case(@ref[.]),'en.pdf'))">
        <document>
            <xsl:attribute name="language" select="./@language"/>
            <xsl:attribute name="ref" select="./@ref"/>
        </document>
    </xsl:if>
</xsl:template>
  

Комментарии:

1. Я думаю, что этот ответ не охватывает все комментарии о нижнем / верхнем регистре и элементе в последовательности

2. Как насчет eN.pdf или En.PDF ?