2013-06-17 2 views
2

У меня есть файл xslt, который просто не будет передавать параметры, и я не могу понять, почему.XSLT: переменные и параметры не передаются

Я сделал это раньше, но не уверен, что мне не хватает.

Я попытался установить глобальную переменную, но, похоже, ее не установили.

Я пытаюсь передать локальную переменную, которая установлена, но она не проходит. Я хотел перейти непосредственно к элементу «SALES/SUBJECT», но он потерял бы эту переменную, и я помню эту проблему, прежде чем иметь дело со встроенным файлом Rules.xsl, поэтому я иду в ELEMENT «SALES», чтобы попытаться получить вокруг него, но он все еще, казалось, пошел туда. Но я обнаружил, что в любом случае параметр был пустым до этого.

Файл XML является:

<?xml version="1.0"?> 
<REPORT VERSION="1.30" MAJORFORM="TomsForm"> 
    <SALES> 
    <SUBJECT LATITUDE="32.2222" LONGITUDE="-118.222222"> 
     <BUSINESS>Joes Bar and Grill</BUSINESS> 
    </SUBJECT> 
    </SALES> 
</REPORT> 

Первый XSLT-файл, который просто пытается создать глобальную переменную, не работает. Если я остановлюсь на линии, где установлен «majorForm», и посмотрите на окно просмотра, @MAJORFORM показывает как «TomsForm», что и должно быть. Но когда я перехожу к следующей строке, это пусто. Таким образом, вниз, где я его использую, из-за этого он также пуст.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:variable name="majorForm" select="@MAJORFORM"/> 

    <xsl:template match="/*"> 
    <xsl:copy> 

     <xsl:apply-templates select="SALES/SUBJECT"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="SALES/SUBJECT"> 
    <xsl:for-each select ="@*"> 
     <xsl:if test="name() = 'LATITUDE'"> 
     <form> 
      <formName> 
      <xsl:value-of select="$majorForm"/> 
      </formName> 
     </form> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

В другом файле я установить его как локальный файл, и он установлен $ majorForm в «TomsForm», но когда я передать его на Apply-шаблонов, он никогда не проходит ничего. Но код видит его как допустимый параметр, просто в нем ничего нет.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/*"> 
    <xsl:copy> 

     <xsl:variable name="majorForm" select="@MAJORFORM"/> 

     <xsl:apply-templates select="SALES"> 
     <xsl:with-param name="mainform" select="$majorForm"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 


    <xsl:template match="SALES"> 
    <xsl:param name="mainForm"/> 
    <xsl:for-each select ="@*"> 
    </xsl:for-each> 
    <xsl:apply-templates> 
     <xsl:with-param name="mainForm" select="$mainForm"/> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="SALES/SUBJECT"> 
    <xsl:param name="mainForm"/> 
    <xsl:for-each select ="@*"> 
     <xsl:if test="name() = 'LATITUDE'"> 
     <form> 
      <formName> 
      <xsl:value-of select="$mainForm"/> 
      </formName> 
     </form> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Я сделал это раньше, и все будет работать нормально.

Я хотел бы узнать, почему ни один из этих способов не работает.

ответ

1

В вашей первой таблице стилей переменная majorForm будет пуста, потому что контекст вашего выражения является корневым узлом (несуществующий узел в пространстве над элементом документа), который не имеет атрибута @MAJORFORM.

Вы должны были бы изменить его на:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:variable name="majorForm" select="/*/@MAJORFORM"/> 

В вашем втором примере, шаблон соответствие /* контекста является элементом документа, REPORT, который не имеет атрибут @MAJORFORM.

Однако вы пытаетесь указать параметр mainform, но соответствие шаблону SALES/SUBJECT имеет параметр mainForm (обратите внимание на заглавную букву «F»).

Изменить его на следующее:

<xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:variable name="majorForm" select="@MAJORFORM"/> 
     <xsl:apply-templates select="SALES"> 
     <xsl:with-param name="mainForm" select="$majorForm"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

Вы могли бы достичь такой же вывод и упростить с помощью следующей таблицы стилей:

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

    <xsl:template match="REPORT"> 
     <xsl:copy>   
      <xsl:apply-templates select="SALES/SUBJECT/@LATITUDE"> 
       <xsl:with-param name="mainForm" select="@MAJORFORM"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="SALES/SUBJECT/@LATITUDE"> 
     <xsl:param name="mainForm"/> 
     <form> 
      <formName> 
       <xsl:value-of select="$mainForm"/> 
      </formName> 
     </form> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Это было. Я знал, что это проблема, но почему-то ее не видно. Во всяком случае, по глобальной проблеме - я был смущен, потому что я отслеживал прогресс, и окно часового пояса показало @MAJORFORM правильно без предшествующих символов по какой-то причине. Что делает «/ * /»?Я знаю, когда я делаю заявление с шаблоном вверху с копией, я использую «/ *», который, как мне кажется, дает мне весь документ. Не уверен, с другой. Но это сработало. Благодарю. – user2462093

+0

"/ *" соответствует элементу документа (первый, самый внешний элемент). Когда вы используете XPath, который начинается с «/», он «перескакивает» вверху документа и запускается в корневом узле. «/ */@ MAJORFORM» выбирает атрибут, прикрепленный к этому элементу документа. –

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