Значение параметра XSLT - PullRequest
       0

Значение параметра XSLT

0 голосов
/ 30 апреля 2019

Я хочу передать position () текущего раздела в шаблоне body.Поэтому я назначил текущую позицию () в переменную "sectionPos".Но когда это происходит, тогда параметр «pSectionPos» в шаблоне «section / body» всегда содержит число 1.

Если я раскомментирую строку в шаблоне «section ...», тогда параметр «pSectionPos»правильно содержит 1, а затем 2.

структура xml:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <content>
        <section type="__section_table_">
            <body>
                <item>
                </item>
                <item>
                </item>
            </body>
        </section>
        <section type="__section_table_">
            <body>
                <item>
                </item>
                <item>
                </item>
            </body>
        </section>
    </content>
</data>

структура xslt:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY newLine          "&#10;">
<!ENTITY tab              "&#9;">
]>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
<xsl:output method='html' standalone="yes" indent="yes" />

<!--root-->
<xsl:template match="/">
  <!DOCTYPE html>
  <html>
      <head>
        <meta charset="UTF-8"/>     
      </head>
      <body>
          <xsl:apply-templates select="//data/content" /> 
          <xsl:text>&newLine;</xsl:text>   
      </body>
  </html>
</xsl:template>

<!--content part-->
<xsl:template match="content">
    <xsl:apply-templates select="section[contains(attribute::type,'__section_table_')]" /> 
</xsl:template>

<!--sections part-->
<xsl:template match="section[contains(attribute::type,'__section_table_')]">    
    <xsl:variable name="sectionPos" as="xs:integer" select="xs:integer(position())" />
    <!--xsl:text>&newLine;</xsl:text>   
    <xsl:text>&tab;&tab;</xsl:text>   
    <xsl:value-of select="$sectionPos" /> 
    <xsl:value-of select="' template-section'"/-->

    <xsl:apply-templates select="body" >
        <xsl:with-param name="pSectionPos" select="$sectionPos" />
    </xsl:apply-templates>
</xsl:template>

<!--section body-->
<xsl:template match="section/body">
    <xsl:param name="pSectionPos" />        
    <xsl:text>&newLine;</xsl:text>   
    <xsl:text>&tab;&tab;</xsl:text>   
    <xsl:value-of select="$pSectionPos"/>
    <xsl:value-of select="' template-body'"/>
</xsl:template>

</xsl:stylesheet>

Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Вы говорите о позиции () текущего "раздела"

Это, кажется, наводит на мысль о недопонимании, поскольку position () не является свойством узла, это свойство списка узлов, которые вы сейчас обрабатываете.

В вашем шаблоне с match="section" значение position() будет позицией раздела, который вы сопоставили в списке узлов, выбранных инструкцией xsl:apply-templates, которая привела к выбору этого раздела. Вы не показали нам эту инструкцию, которая предполагает, что вы не оценили ее важность.

Некоторые люди ошибаются, думая, что position() возвращает положение элемента среди своих братьев и сестер. Если это то, что вы хотите, может быть лучше использовать xsl:number или count(preceding-sibling::XXXX).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...