Как сделать запрос для получения всех w: r / w: t внутри // w: body / w: p, используя xslt 2.0? - PullRequest
1 голос
/ 21 сентября 2011

Это мой XML-файл ...

<w:document>

        <w:body>

           <w:p>
                <w:r>
                    <w:t>
                      Paragraph1
                     </w:t>
                 </w:r>
             </w:p>
          </w:body>
</w:document>

Это мой второй XML-файл ...

 <w:document>
    <w:body>
        <w:p>
            <w:r>
               <w:pict>
                    <v:shape>
                       <v:textbox>
                           <w:txbxContent>
                              <w:p>
                                 <w:r>
                                    <w:t>
                                       Paragraph2
                                     </w:t>
                                 </w:r>
                                </w:p>
                             </w:txbxContent>
                           <v:textbox>
                        </v:shape>
                     </w:pict>
                  </w:r>
                </w:p>
              </w:body>
             </w:document>

Здесь я написал один файл xslt и вызываю свой шаблон всякий раз, когда нахожу //w:body/w:p/w:r/w:t.

   for example,


 <xsl:apply-templates select="//w:body/w:p[w:r[w:t]]">
   </xsl:apply-templates>

мой собственный шаблон

<xsl:template match="w:p">
            Do something here
       </xsl:template>

мой xslt корректно работает с моим первым XML-документом. Но он не работает со вторым, а также с некоторым сценарием, подобным этому. Итак, как я могу добиться обоих этих сценариев, изменив этот запрос здесь ...

<xsl:apply-templates select="?????"> <!-- how to find the case that also matching my second xml file -->
</xsl:apply-templates>

Пожалуйста, помогите мне выйти из этого вопроса ...

1 Ответ

1 голос
/ 21 сентября 2011
* +1000 * Используйте
<xsl:apply-templates select="//w:p[w:r/w:t]"> 

Вы можете также изменить атрибут соответствия шаблона, чтобы он был немного более конкретным:

<xsl:template match="w:p[w:r/w:t]"> 
  <!-- Processing here -->
</xsl:template> 

Полный код :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:w="w:w">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
   <xsl:apply-templates select="//w:p[w:r/w:t]"/>
 </xsl:template>

 <xsl:template match="w:p[w:r/w:t]">
  <xsl:value-of select="w:r/w:t"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к первому предоставленному документу XML (пространство имен определено, чтобы сделать его правильно сформированным):

<w:document xmlns:w="w:w">
    <w:body>
        <w:p>
            <w:r>
                <w:t>
                 Paragraph1
             </w:t>
            </w:r>
        </w:p>
    </w:body>
</w:document>

получен правильный результат :

             Paragraph1

когда то же преобразование применяется ко второму при условии «XML» (оно сильно искажено, и я потратил много минут, пока не сделал его правильно сформированным !!!):

<w:document xmlns:w="w:w">
    <w:body>
        <w:p>
            <w:r>
                <w:pict>
                    <v:shape xmlns:v="v:v">
                        <v:textbox>
                            <w:txbxContent>
                                <w:p>
                                    <w:r>
                                        <w:t>
                      Paragraph2
                                        </w:t>
                                    </w:r>
                                </w:p>
                            </w:txbxContent>
                        </v:textbox>
                    </v:shape>
                </w:pict>
            </w:r>
        </w:p>
    </w:body>
</w:document>

снова желаемый результат получается :

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