Можно ли посчитать положение индекса моего текущего узла, принадлежащего дочернему элементу <w: body>, с помощью xslt2.0? - PullRequest
0 голосов
/ 28 сентября 2011

Это мой XML-документ.

<w:document xmlns:w="w">
<w:body>
   <w:p>
        <w:r>
           <w:t>
               Para1
            </w:t>
        </w:r>
     </w:p>
   <w:p>
        <w:r>
           <w:t>
               Para2
            </w:t>
        </w:r>
     </w:p>
   <w:p>
        <w:r>
           <w:t>
               Para3
            </w:t>
        </w:r>
     </w:p>
   <w:p>
        <w:r>
           <w:t>
               Para4
            </w:t>
        </w:r>
     </w:p>
   <w:p>
        <w:r>
           <w:t>
               Para5
            </w:t>
        </w:r>
     </w:p>

   <w:tbl>
         <w:tr>
            <w:tc>
               <w:p>
                  <w:r>
                    <w:t>
                         Para6
                    </w:t>
                   </w:r>
                </w:p>
              </w:tc>
            <w:tc>
               <w:p>
                  <w:r>
                    <w:t>
                         Para7 <!-- Just Assume, this is current Node -->
                    </w:t>
                   </w:r>
                </w:p>
              </w:tc>
           </w:tr>
        </w:tbl>
     <w:p>
        <w:r>
           <w:t>
               Para8
            </w:t>
        </w:r>
     </w:p>

</w:body>
</w:document>

Итак, теперь я хочу получить индексную позицию текущего узла, принадлежащего дочернему элементу <w:body>. Так что мой ожидаемый результат: 6. *Например, 1005 *

,

  1. , если текущий узел равен para6, тогда мой вывод также равен 6.
  2. , если текущий узел - para8, тогда мой вывод равен 7.
  3. если текущий узел равен para5, то мой вывод равен 5.

Если возможно, пожалуйста, сообщите мне, чтобы получить это ...

Новое обновление:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                              xmlns:v="urn:schemas-microsoft-com:vml"
                              xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"
                              xmlns:exsl="http://exslt.org/common"
                              xmlns:fn="http://www.w3.org/2005/xpath-functions"
                              extension-element-prefixes="exsl">


  <xsl:output method="html" indent="yes"/>

    <xsl:template match="*">
      <Document>
         <xsl:apply-templates select="//w:p">
         </xsl:apply-templates>
      </Document>
    </xsl:template>

  <xsl:template match="w:p">

       <xsl:variable name="index">
            <xsl:call-template name="get-para-index">
                 <xsl:with-param name="node" select="."/>
            </xsl:call-template>
       </xsl:variable>

     <Paragraph>
            <xsl:attribute name="index">
                 <xsl:value-of select="$index" />
            </xsl:attribute>

            <xsl:apply-templates select="./w:r/w:t"/>
     </Paragraph>

  </xsl:template>

  <xsl:template match="w:t">
    <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template name="get-para-index">
       <xsl:param name="node"/>
    <xsl:value-of select="count($node/ancestor::*[parent::w:body]/preceding-sibling::*)+1"/>     <!-- Need to write logic here -->
  </xsl:template>

</xsl:stylesheet>

Я просто вызываю get-para-index template для получения индексной позиции каждого <w:p>. Но он всегда возвращает 1 для каждого <w:p>.Пожалуйста, помогите мне выйти из этой проблемы ...

Спасибо и С уважением, P.SARAVANAN

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Я не на 100% уверен в том, что вы хотите, но это выражение

count(ancestor::*[parent::w:body]/preceding-sibling::*)+1

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

0 голосов
/ 30 сентября 2011

Мой обновленный Xslt, который выполнил мои запросы ...

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                              xmlns:v="urn:schemas-microsoft-com:vml"
                              xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"
                              xmlns:exsl="http://exslt.org/common"
                              xmlns:fn="http://www.w3.org/2005/xpath-functions"
                              extension-element-prefixes="exsl">


  <xsl:output method="html" indent="yes"/>

    <xsl:template match="*">
      <Document>
         <xsl:apply-templates select="//w:p">
         </xsl:apply-templates>
      </Document>
    </xsl:template>

  <xsl:template match="w:p">

       <xsl:variable name="index">
            <xsl:call-template name="get-para-index">
                 <xsl:with-param name="node" select="."/>
            </xsl:call-template>
       </xsl:variable>

     <Paragraph>
            <xsl:attribute name="index">
                 <xsl:value-of select="$index" />
            </xsl:attribute>

            <xsl:apply-templates select="./w:r/w:t"/>
     </Paragraph>

  </xsl:template>

  <xsl:template match="w:t">
    <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template name="get-para-index">
       <xsl:param name="node"/>

    <xsl:choose>
      <xsl:when test="$node/ancestor::*[parent::w:body]">
        <xsl:value-of select="count($node/ancestor::*[parent::w:body]/preceding-sibling::*)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="count($node/preceding-sibling::*)"/>
      </xsl:otherwise>
    </xsl:choose>          
  </xsl:template>

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