У меня есть файл 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>
Я сделал это раньше, и все будет работать нормально.
Я хотел бы узнать, почему ни один из этих способов не работает.
Это было. Я знал, что это проблема, но почему-то ее не видно. Во всяком случае, по глобальной проблеме - я был смущен, потому что я отслеживал прогресс, и окно часового пояса показало @MAJORFORM правильно без предшествующих символов по какой-то причине. Что делает «/ * /»?Я знаю, когда я делаю заявление с шаблоном вверху с копией, я использую «/ *», который, как мне кажется, дает мне весь документ. Не уверен, с другой. Но это сработало. Благодарю. – user2462093
"/ *" соответствует элементу документа (первый, самый внешний элемент). Когда вы используете XPath, который начинается с «/», он «перескакивает» вверху документа и запускается в корневом узле. «/ */@ MAJORFORM» выбирает атрибут, прикрепленный к этому элементу документа. –