проверка значения переменной внутри переменной с более высоким приоритетом в XSLT - PullRequest
4 голосов
/ 30 декабря 2008

Мне нужно иметь возможность проверить, что "текущее" значение переменной находится внутри переопределения этой же переменной в другом xslt, который включает в себя другой.

main.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="other.xslt"/>
    <xsl:variable name="email">
        <xsl:if test="string-length($email) = 0">
            bar@foo.com
        </xsl:if>
    </xsl:variable>
    <xsl:template match="/">
        <Email>
            <xsl:value-of select="$email"/>
        </Email>
    </xsl:template>
</xsl:stylesheet>

other.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="email">foo@bar.com</xsl:variable>
</xsl:stylesheet>

То, что я хотел бы сделать, это иметь возможность проверить, какое значение будет иметь переменная с более низким приоритетом, чтобы увидеть, нужно ли мне перезаписывать его в переменной в текущем xslt. (отказ от ответственности - текущий код злобно падает)

Ответы [ 2 ]

4 голосов
/ 31 декабря 2008

Как уже отмечали другие, добавление значения по умолчанию к глобальной переменной, определенной в импортированной таблице стилей, не может быть выполнено с использованием того же имени переменной . Это связано с тем, что переменная с таким именем, определенная в текущей таблице стилей xslt, имеет более высокий приоритет, чем переменная в импортированной таблице стилей, и будет использоваться только первая (вы не можете получить доступ к переменной с одинаковым именем в таблице стилей с более низким приоритетом).

Вот как можно добавить значение по умолчанию :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--                                            -->
  <xsl:import href="other.xsl"/> 
<!--                                            -->
    <xsl:variable name="vMyEmail" select=
     "concat(substring('bar@foo.com', 1 div not($vEmail)), $vEmail)"
     />
<!--                                            -->
    <xsl:template match="/">
      <xsl:value-of select="$vMyEmail"/>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание , что глобальная переменная $vMyEmail определена таким образом, что она имеет значение переменной $vEmail (определено в импортированная таблица стилей), если это строка длиной не менее 1 или требуемое значение по умолчанию - в противном случае.

Используя эту технику, каждый будет использовать так определенный $vMyEmail в любом месте после его определения. Переменная $vEmail из импортированной таблицы стилей вообще не будет использоваться напрямую .

0 голосов
/ 30 декабря 2008

Вы не можете делать то, что хотите напрямую, вам нужно установить вторую переменную.

Но я не могу понять намерение: если бы это было на основе шаблона, вы могли бы предоставить значение по умолчанию для любого параметра (который действует очень похоже на переменные). То, как вы формулируете вопрос, предполагает, что это правильный подход ко мне, но не могли бы вы уточнить, как эти шаблоны связаны и используются?

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