Сравнение строк в XSLT - PullRequest
       29

Сравнение строк в XSLT

2 голосов
/ 20 января 2010

Когда я вызываю этот шаблон, я получаю следующие результаты.

155IT Matches 155OO
155OO Matches 155OO
155PP

XML, который я обрабатываю, имеет три строки, и это значения, но почему тест возвращает true для первых двух и false для последнего? Как я должен делать сравнение строк?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  <xsl:template name="ProofOfConcept">
      <xsl:param name="Lines"/>
      <xsl:param name="MainDeliveryCode"/>
      <xsl:choose>
        <xsl:when test="$Lines">
            <xsl:variable name="CurrentDeliveryCode" select="$Lines/DLVYLOCCD"/>
            <p>
            <xsl:choose>
                <xsl:when test=" $MainDeliveryCode = $CurrentDeliveryCode">
<xsl:value-of select="$CurrentDeliveryCode"/> Matches <xsl:value-of select="$MainDeliveryCode"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$Lines"/> Fails <xsl:value-of select="$MainDeliveryCode"/>
                </xsl:otherwise>
            </xsl:choose>
            </p>
            <xsl:call-template name="ProofOfConcept">
                        <xsl:with-param name="Lines" select="$Lines[position() > 1]"/>
                        <xsl:with-param name="MainDeliveryCode" select="$MainDeliveryCode"/>
                     </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
      </xsl:choose>
  </xsl:template>

  <xsl:template match="/">
    <html>
        <head>
            <title></title>
        </head>
        <body>
            <xsl:call-template name="ProofOfConcept">
                <xsl:with-param name="Lines" select="data/Lines/LINE"/>
                <xsl:with-param name="MainDeliveryCode" select="data/header/DLVYLOCCD"/>
            </xsl:call-template>
        </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Пример данных

 <?xml version="1.0"
 encoding="ISO-8859-1"
 standalone="yes"?> <data>   
 <header><DLVYLOCCD>155OO</DLVYLOCCD>
 </header>    <Lines>
       <LINE><DLVYLOCCD>155IT</DLVYLOCCD></LINE>
       <LINE><DLVYLOCCD>155OO</DLVYLOCCD></LINE>
       <LINE><DLVYLOCCD>155PP</DLVYLOCCD></LINE>
</Lines> </data>

Спасибо за любой совет.

Ответы [ 3 ]

3 голосов
/ 21 января 2010

В вашей реализации есть несколько ошибок. Самое главное выражение:

<xsl:variable name="CurrentDeliveryCode" select="$Lines/DLVYLOCCD"/>

возвращает набор узлов, состоящий из всех элементов DLVYLOCCD, а не только текущего, как вы, похоже, предполагаете. Кроме того, вы не должны использовать рекурсию для итерации. Вместо этого используйте <xsl:for-each>, в этом случае вы будете обрабатывать элементы по одному.

3 голосов
/ 21 января 2010

Вот менее болезненная версия вашего XSLT:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="data">
    <html>
      <head>
        <title></title>
      </head>
      <body>
        <!-- this selects the matching LINE node(s), or nothing at all -->
        <xsl:apply-templates select="
          Lines/LINE[DLVYLOCCD = /data/header/DLVYLOCCD]
        " />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="LINE">
    <p>
      <!-- for the sake of the example, just output a copy -->
      <xsl:copy-of select="." />
    </p>
  </xsl:template>

</xsl:stylesheet>

дает (отформатированный результат):

<?xml version="1.0" encoding="utf-8"?>
<html>
  <head>
    <title></title>
  </head>
  <body>
    <p>
      <LINE><DLVYLOCCD>155OO</DLVYLOCCD></LINE>
    </p>
  </body>
</html>
1 голос
/ 20 января 2010

Я понял это.

Мне нужно изменить свой тест на

<xsl:when test="contains($MainDeliveryCode, $CurrentDeliveryCode" >

Это решило проблему.

http://www.zvon.org/xxl/XSLTreference/Output/function_contains.html - документация для функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...