2016-03-30 2 views
0

У меня есть этот XML:Я не понимаю, почему у меня нет возможности для этой глобальной переменной и есть ли альтернатива?

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="aj.xsl"?> 
<Test> 
    <Highlight> 
    <HighlightName>Name 1</HighlightName> 
    <HighlightName>Name 2</HighlightName> 
    <HighlightName>Name 3</HighlightName> 
    <HighlightName>Name 5</HighlightName> 
    <HighlightName>Name 6</HighlightName> 
    </Highlight> 
    <Date> 
    <Name>Name 1</Name> 
    </Date> 
    <Date> 
    <Name>Name 6</Name> 
    </Date> 
    <Date> 
    <Name>Name 2</Name> 
    </Date> 
    <Date> 
    <Name>Name 7</Name> 
    </Date> 
    <Date> 
    <Name>Name 3</Name> 
    </Date> 
    <Date> 
    <Name>Name 8</Name> 
    </Date> 
    <Date> 
    <Name>Name 4</Name> 
    </Date> 
    <Date> 
    <Name>Name 9</Name> 
    </Date> 
    <Date> 
    <Name>Name 5</Name> 
    </Date> 
</Test> 

и некоторый тест XSL:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-Version2.css"/> 
     <title>Test</title> 
     </head> 
     <body> 
     <xsl:for-each select="Test/Highlight/HighlightName"> 
      <xsl:variable name="strHighlightName" select="."/> 
      <p>Start of list for {$strHighlightName}</p> 
      <xsl:for-each select="Test/Date"> 
      <xsl:apply-templates select="Name"/> 
      </xsl:for-each> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Name"> 
    <p> 
     <xsl:if test="$strHighlightName=."> 
     <xsl:text>**</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="."/> 
    </p> 

    </xsl:template> 
</xsl:stylesheet> 

Образец короток, чтобы передать этот вопрос. В финальном сценарии мои файлы более подробные.

Основная концепция, которую я пыталась реализовать, состояла в том, чтобы перебирать список известных имен, которые я хотел выделить. Затем, между прочим, я хотел указать, было ли какое-либо из названий в другом месте одним из выделенных. Так что я попробовал выше, но, к сожалению, переменная strHighlightName не видна Название template.

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

Поскольку я не могу использовать этот подход, могу ли я сделать это по-другому? Например, могу ли я сделать что-то вроде этого:

<xsl:template match="Name"> 
    Does "." match any of the names in the "//Highlight/HighlightName" section? 
    If yes 
     Text "** " 
</xsl:template> 

Это имеет смысл? Это позволит избежать необходимости в переменных и/или параметрах прохождения.

спасибо.

ответ

1
I realise I can use parameters and feed the value in to the template, but in the real world I would have to cascade this param all the way down into the template can calls Name. 

В XSLT 1.0 каскадирование всех промежуточных шаблонов - это то, что вам нужно сделать.

В XSLT 2.0 вы можете использовать параметры туннеля, которые туннелируются от первого шаблона ко второму, без необходимости явно указывать во всех промежуточных.

Итак, посмотрите, доступен ли процессор XSLT 2.0 в вашей прикладной среде.