2009-06-22 5 views
0

Я пытаюсь реализовать текстовый фильтр, который добавляет родительский узел к каждому текстовому узлу.XSLT - добавление тегов в узел text()

<xsl:template match="text()"> 
    <aNewTag><xsl:value-of select="."/></aNewTag> 
</xsl:template> 

Это прекрасно работает до тех пор, когда я называю это косвенно:

<xsl:apply-templates/> 

Но если я позвоню шаблон непосредственно с помощью

<xsl:apply-templates select="text()"/> 

новый тег исчезает.

Может ли кто-нибудь объяснить мне, почему?

Приветствия
Jan

+0

информацию, которую вы дали, это работает последовательно для меня. применяется независимо от того, какой метод я использовал для выбора текстовых узлов. Это означает, что вам придется опубликовать образец кода XML и XSLT, который не подходит для вас. – Tomalak

ответ

0

Если вы используете Xal: Наносить-шаблоны элементов без выбора атрибута, значение выбора неявно устанавливается в узел(), т.е. все дочерние узлы и, следовательно, ваш текст() шаблон соответствует.

1

Я был немного смущен своим собственным кодом. Полный пример выглядит следующим образом:

<xsl:template match="/"> 
    <xsl:call-template name="a"> 
     <xsl:with-param name="b"> 
      <xsl:apply-templates select="text()"/> 
     </xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="a"> 
    <xsl:param name="b"/> 
    <xsl:value-of select="$b"/> <!-- here is my error --> 
</xsl:template> 

<xsl:template match="text()"> 
    <aNewTag> 
     <xsl:value-of select="."/> 
    </aNewTag> 
</xsl:template> 

Моя ошибка была, что я не видел value-of в шаблоне запроса. Если я изменю value-of на apply-templates, все будет хорошо.

Благодаря
Jan

0

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

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:schemas-microsoft-com:xslt"> 
    <xsl:template match="/"> 
     <xsl:call-template name="a"> 
      <xsl:with-param name="b"> 
       <xsl:apply-templates select="text()"/> 
      </xsl:with-param> 
     </xsl:call-template> 
    </xsl:template> 
    <xsl:template name="a"> 
     <xsl:param name="b"/> 
     <xsl:for-each select="ext:node-set($b)"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="text()"> 
     <aNewTag> 
      <xsl:value-of select="."/> 
     </aNewTag> 
    </xsl:template> 
</xsl:stylesheet> 

Этот файл работает только для XML-анализатора Microsoft (MSXML). Для других XML-процессоров, таких как xsltproc, должно использоваться пространство имен «http://exslt.org/common».

Это позволяет вам получить доступ к узлу или узлам, которые составляют параметр «b», хотя в моем примере выше я использовал их для итерации по ним.

Вот статья, которая объясняет о наборе узлов

XML.Com Article

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