2013-10-09 2 views
0

data.xml:Разрешающая подэлементы переменной, которая была передана в шаблон

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="myxslt2.xslt"?> 
<data> 
    <foo>Hello</foo> 
    <bar>World</bar> 
    <foobar>This is a test</foobar> 
</data> 

myxslt2.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" version="1.0"> 
    <xsl:output method="html" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" indent="yes"/> 
    <xsl:variable name="main" select="/data"/> 
    <xsl:template name="myTemplate"> 
     <xsl:param name="myparam"/> 
     Inner1:<xsl:value-of select="msxsl:node-set($myparam)"/> 
     <br/> 
     Inner2:<xsl:value-of select="msxsl:node-set($myparam)/foobar"/> 
    </xsl:template> 
    <xsl:template match="/data"> 
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
     HTML STARTS 
      <br/> 
      <xsl:variable name="data" select="."/> 
      Outer1:<xsl:value-of select="$data"/> 
      <br/> 
      Outer2:<xsl:value-of select="$data/foobar"/> 
      <br/> 
      <xsl:call-template name="myTemplate"> 
       <xsl:with-param name="myparam"> 
        <xsl:value-of select="$data"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

HTML STARTS 
Outer1: Hello World This is a test 
Outer2:This is a test 
Inner1: Hello World This is a test 
Inner2: 

Может кто-нибудь объяснить, почему внутренняя часть не разрешает субэлемент, пока внешний?

ответ

1

Проблема заключается, когда вы передаете ваш $ данные переменную в в качестве параметра MyTemplate

<xsl:call-template name="myTemplate"> 
    <xsl:with-param name="myparam"> 
     <xsl:value-of select="$data"/> 
    </xsl:with-param> 
</xsl:call-template> 

Поскольку вы используете XSL: стоимость из здесь, это только прохождения текстовое значение узлов, хранящихся в $ data; т.е. параметр является всего лишь одним текстовым узлом. Чтобы сохранить узлы, которые нужно будет использовать XSL: скопировать из

<xsl:call-template name="myTemplate"> 
    <xsl:with-param name="myparam"> 
     <xsl:copy-of select="$data"/> 
    </xsl:with-param> 
</xsl:call-template> 

Строго говоря, это прохождение «результат фрагмента дерева», который является, почему вы должны использовать функцию расширения набора узлов, но вы должны изменить ваше использование этого, поскольку данные узел не является строго родительский узел здесь, фрагмент документа

Inner1:<xsl:value-of select="msxsl:node-set($myparam)/data"/> 
    <br /> 
    Inner2:<xsl:value-of select="msxsl:node-set($myparam)/data/foobar"/> 

Но, на самом деле не должны использовать набор узлов здесь на самом деле. Измените способ вызова этого шаблона ...

<xsl:call-template name="myTemplate"> 
    <xsl:with-param name="myparam" select="$data"/> 
</xsl:call-template> 

Здесь важная разница. Это больше не фрагмент дерева результатов, а ссылка на входной документ напрямую, что означает, что вам вообще не нужно использовать набор узлов.

<xsl:template name="myTemplate"> 
    <xsl:param name="myparam"/> 
    Inner1:<xsl:value-of select="$myparam"/> 
    <br /> 
    Inner2:<xsl:value-of select="$myparam/foobar"/> 
</xsl:template> 
Смежные вопросы