XSL-именованный параметр 'with-param' с использованием 'apply-templates'

Мои вопросы находятся внизу этого сообщения, если вы хотите прочитать их перед полным объяснением.

Я конвертирую XML-документ в красивую веб-страницу с помощью XSL, и у меня возникли проблемы с правильной передачей переменной. У меня определено много xsl: template , и мне нужно передать определенный параметр только одному из них. Я надеялся, что смогу передать именованный параметр, который предположительно будет отправлен всем xsl: template s, но может использоваться только одним и игнорироваться другими. Однако при попытке проверить это на себе (и в моем ограниченном понимании XSL) я вообще не смог передать параметр, не говоря уже о том, чтобы проверить, не мешает ли он случайно другим xsl: template .

Ниже приводится упрощенный пример кода ( введен для этого вопроса, он может содержать одну или две опечатки ). У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<wrapperNode>
  <testNode>
    <subNode/>
  </testNode>
</wrapperNode>

main.xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="test.xsl"/>
<xsl:output method="html" indent="yes"/>

<xsl:template match="/">

<html>
  <body>
      <xsl:apply-templates>
        <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
      </xsl:apply-templates>
  </body>
</html>

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

test.xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="testNode">
  <xsl:param name="testParam" />
  TEST1
  <xsl:value-of select="$testParam" />
  TEST2
</xsl:template>
</xsl:stylesheet>

Вывод (фактический):

TEST1 TEST2

Вывод ( ожидаемый / желаемый):

TEST1 TEST_PARAMETER TEST2

Мои вопросы по этому поводу:

  1. Можно ли отправить именованный при попытке проверить это на себе (и мое ограниченное понимание XSL) я вообще не смог передать параметр, не говоря уже о том, чтобы проверить, не мешал ли он случайно другим xsl: template s.

    Ниже приведен упрощенный пример кода (, набранный для этого вопроса, он может содержать одну или две опечатки ). У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

    XML-файл:

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="main.xsl"?>
    <wrapperNode>
      <testNode>
        <subNode/>
      </testNode>
    </wrapperNode>
    

    main.xsl:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="test.xsl"/>
    <xsl:output method="html" indent="yes"/>
    
    <xsl:template match="/">
    
    <html>
      <body>
          <xsl:apply-templates>
            <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
          </xsl:apply-templates>
      </body>
    </html>
    
    </xsl:template>
    </xsl:stylesheet>
    

    test.xsl:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="testNode">
      <xsl:param name="testParam" />
      TEST1
      <xsl:value-of select="$testParam" />
      TEST2
    </xsl:template>
    </xsl:stylesheet>
    

    Вывод (фактический):

    TEST1 TEST2
    

    Вывод ( ожидаемый / желаемый):

    TEST1 TEST_PARAMETER TEST2
    

    Мои вопросы по этому поводу:

    1. Можно ли отправить именованный при попытке проверить это на себе (и мое ограниченное понимание XSL) я вообще не смог передать параметр, не говоря уже о том, чтобы проверить, не мешал ли он случайно другим xsl: template s.

      Ниже приведен упрощенный пример кода (, набранный для этого вопроса, он может содержать одну или две опечатки ). У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

      XML-файл:

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="main.xsl"?>
      <wrapperNode>
        <testNode>
          <subNode/>
        </testNode>
      </wrapperNode>
      

      main.xsl:

      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:import href="test.xsl"/>
      <xsl:output method="html" indent="yes"/>
      
      <xsl:template match="/">
      
      <html>
        <body>
            <xsl:apply-templates>
              <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
            </xsl:apply-templates>
        </body>
      </html>
      
      </xsl:template>
      </xsl:stylesheet>
      

      test.xsl:

      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="testNode">
        <xsl:param name="testParam" />
        TEST1
        <xsl:value-of select="$testParam" />
        TEST2
      </xsl:template>
      </xsl:stylesheet>
      

      Вывод (фактический):

      TEST1 TEST2
      

      Вывод ( ожидаемый / желаемый):

      TEST1 TEST_PARAMETER TEST2
      

      Мои вопросы по этому поводу:

      1. Можно ли отправить именованный не говоря уже о том, чтобы проверить, не мешал ли он случайно другим xsl: template s.

        Ниже приводится упрощенный пример кода (, набранный для этого вопроса, он может содержать одну или две опечатки ). У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

        XML-файл:

        <?xml version="1.0" encoding="UTF-8"?>
        <?xml-stylesheet type="text/xsl" href="main.xsl"?>
        <wrapperNode>
          <testNode>
            <subNode/>
          </testNode>
        </wrapperNode>
        

        main.xsl:

        <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:import href="test.xsl"/>
        <xsl:output method="html" indent="yes"/>
        
        <xsl:template match="/">
        
        <html>
          <body>
              <xsl:apply-templates>
                <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
              </xsl:apply-templates>
          </body>
        </html>
        
        </xsl:template>
        </xsl:stylesheet>
        

        test.xsl:

        <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="testNode">
          <xsl:param name="testParam" />
          TEST1
          <xsl:value-of select="$testParam" />
          TEST2
        </xsl:template>
        </xsl:stylesheet>
        

        Вывод (фактический):

        TEST1 TEST2
        

        Вывод ( ожидаемый / желаемый):

        TEST1 TEST_PARAMETER TEST2
        

        Мои вопросы по этому поводу:

        1. Можно ли отправить именованный не говоря уже о том, чтобы проверить, не мешал ли он случайно другим xsl: template s.

          Ниже приводится упрощенный пример кода (, набранный для этого вопроса, он может содержать одну или две опечатки ). У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

          XML-файл:

          <?xml version="1.0" encoding="UTF-8"?>
          <?xml-stylesheet type="text/xsl" href="main.xsl"?>
          <wrapperNode>
            <testNode>
              <subNode/>
            </testNode>
          </wrapperNode>
          

          main.xsl:

          <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:import href="test.xsl"/>
          <xsl:output method="html" indent="yes"/>
          
          <xsl:template match="/">
          
          <html>
            <body>
                <xsl:apply-templates>
                  <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
                </xsl:apply-templates>
            </body>
          </html>
          
          </xsl:template>
          </xsl:stylesheet>
          

          test.xsl:

          <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:template match="testNode">
            <xsl:param name="testParam" />
            TEST1
            <xsl:value-of select="$testParam" />
            TEST2
          </xsl:template>
          </xsl:stylesheet>
          

          Вывод (фактический):

          TEST1 TEST2
          

          Вывод ( ожидаемый / желаемый):

          TEST1 TEST_PARAMETER TEST2
          

          Мои вопросы по этому поводу:

          1. Можно ли отправить именованный У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

            XML-файл:

            <?xml version="1.0" encoding="UTF-8"?>
            <?xml-stylesheet type="text/xsl" href="main.xsl"?>
            <wrapperNode>
              <testNode>
                <subNode/>
              </testNode>
            </wrapperNode>
            

            main.xsl:

            <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:import href="test.xsl"/>
            <xsl:output method="html" indent="yes"/>
            
            <xsl:template match="/">
            
            <html>
              <body>
                  <xsl:apply-templates>
                    <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
                  </xsl:apply-templates>
              </body>
            </html>
            
            </xsl:template>
            </xsl:stylesheet>
            

            test.xsl:

            <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="testNode">
              <xsl:param name="testParam" />
              TEST1
              <xsl:value-of select="$testParam" />
              TEST2
            </xsl:template>
            </xsl:stylesheet>
            

            Вывод (фактический):

            TEST1 TEST2
            

            Вывод ( ожидаемый / желаемый):

            TEST1 TEST_PARAMETER TEST2
            

            Мои вопросы по этому поводу:

            1. Можно ли отправить именованный У меня есть много разных xsl: template , определенных для работы с узлами в XML, и до сих пор все работало нормально. Проблема заключается в добавлении параметра к этим шаблонам.

              XML-файл:

              <?xml version="1.0" encoding="UTF-8"?>
              <?xml-stylesheet type="text/xsl" href="main.xsl"?>
              <wrapperNode>
                <testNode>
                  <subNode/>
                </testNode>
              </wrapperNode>
              

              main.xsl:

              <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              <xsl:import href="test.xsl"/>
              <xsl:output method="html" indent="yes"/>
              
              <xsl:template match="/">
              
              <html>
                <body>
                    <xsl:apply-templates>
                      <xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
                    </xsl:apply-templates>
                </body>
              </html>
              
              </xsl:template>
              </xsl:stylesheet>
              

              test.xsl:

              <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              <xsl:template match="testNode">
                <xsl:param name="testParam" />
                TEST1
                <xsl:value-of select="$testParam" />
                TEST2
              </xsl:template>
              </xsl:stylesheet>
              

              Вывод (фактический):

              TEST1 TEST2
              

              Вывод ( ожидаемый / желаемый):

              TEST1 TEST_PARAMETER TEST2
              

              Мои вопросы по этому поводу:

              1. Можно ли отправить именованный параметр для всех моих xsl: template с использованием xsl: apply-templates с xsl: with-param , но выберите это значение, в частности, на name = в пределах фактический шаблон, чтобы он мог явно использоваться в одном шаблон и игнорируется всеми остальными (даже если бы я хотел добавить другое, иначе названные, параметры для другие шаблоны позже)?

              2. Что я делаю не так с моим текущим примером кода, что он, кажется, вообще не получает параметр?

              3. Есть ли лучший способ сделать это?

              Изменить: Я хочу прояснить, что из-за другого вывода в шаблоне test.xsl : testNode я точно знаю, что он IS вызывается успешно. Не работает ТОЛЬКО часть параметров. Я не хочу тратить время людей на выяснение, почему этот шаблон не вызывается. Это так.

              Обновление: В ответ на первоначально полученные мной ответы, в которых указывалось, что составленный мной пример не был полностью правильным (моя ошибка) и не очень четко отражал проблему (т.е. правильный шаблон вызывается , но это только параметр, похоже, не работает), я заменил примеры на гораздо лучшие. Этот пример более четко показывает, что шаблон testNode вызывается успешно, но параметр не передается. Я проверял это много раз, до и после рассмотрения предыдущих ответов на этот вопрос. Я абсолютно озадачен, поскольку все кажется правильным из того, что я читал в другом месте, и из того, что люди предлагали до сих пор.

18
задан KevenK 19 November 2010 в 14:59
поделиться