Вызов шаблона изнутри <xsl: for-each> - PullRequest
4 голосов
/ 08 марта 2011

У меня есть xsl, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:nsm="http://192.137.81.132/deneme/sample.xsd"
               exclude-result-prefixes="nsm">

    <xsl:output method="text"/>
    <xsl:param name="fieldOf">address</xsl:param>
    <xsl:param name="inputId" select="concat($fieldOf,'/value')"/>

    <xsl:variable name="vXpathExpression" select="concat('global/fieldset/field/', $inputId)"/>
    <!-- these fields are from xml file-->

    <xsl:template match="/">
        <xsl:value-of select="$vXpathExpression"/>: <xsl:text/>
        <xsl:for-each select="document('sample.xsd')/xs:schema/xs:complexType[@name='fieldtype']/xs:choice/child::*">

        </xsl:for-each>

        <xsl:call-template name="getNodeValue">
            <xsl:with-param name="pExpression" select="$vXpathExpression" />
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="getNodeValue">
        <xsl:param name="pExpression"/>
        <xsl:param name="pCurrentNode" select="."/>

        <xsl:choose>
            <xsl:when test="not(contains($pExpression, '/'))">
                <xsl:value-of select="$pCurrentNode/*[name()=$pExpression]"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="getNodeValue">
                    <xsl:with-param name="pExpression" select="substring-after($pExpression, '/')"/>
                    <xsl:with-param name="pCurrentNode" select="$pCurrentNode/*[name()=substring-before($pExpression, '/')]"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

В этом случае это работает.Но я не могу запустить его, когда я вызываю шаблон изнутри для каждого.Это ничего не дает, ни ошибки, ни значений.Есть ли способ решить эту проблему?Спасибо

Редактировать: Вы можете задаться вопросом, работает ли для каждого.Оно делает.Я могу получить атрибуты для каждого.

1 Ответ

5 голосов
/ 08 марта 2011

Проблема в том, что :

<xsl:for-each select=
"document('sample.xsd')/xs:schema
          /xs:complexType[@name='fieldtype']/xs:choice/child::*">

изменяет текущий документ.

Попытка оценить выражение XPath для исходного XML, в то время как текущий документ не является исходным XML, не приводит к желаемому результату, поскольку в текущем документе нет таких именованных элементов.

Решение простое :

<xsl:variable name="vSourceDoc" select="/"/>

<xsl:for-each select=
"document('sample.xsd')/xs:schema
              /xs:complexType[@name='fieldtype']/xs:choice/child::*">

    <xsl:call-template name="getNodeValue">                    
     <xsl:with-param name="pCurrentNode" select="$vSourceDoc" />                  
     <xsl:with-param name="pExpression" select="$vXpathExpression" />                  
   </xsl:call-template>            
</xsl:for-each> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...