2011-09-21 56 views
1

这是我的xml文件...如何使用xslt 2.0在w:body/w:p中获取所有w:r/w:t的查询?

<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的:p/W:R/W:吨。

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 document.But它正常工作,不与第二个,也有一些场景像that.So工作,我怎样才能达到既这种情况下通过修改此查询...的

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

请指引我走出这个问题...

回答

1

使用

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

您可以ASO更改模板的match属性稍微更具体:

<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 
+0

:对不起Dimitre,这不符合我上述情况的工作......我认为他并没有叫我的模板... – Saravanan

+0

@Saravan:如果有*任何匹配匹配模式的*元素,那么必须选择模板执行 - 否则,可能有另一个模板也匹配此元素并具有更高的优先级/优先级。 –

+0

@现在我只用我的第二个XML文件进行了测试,我发现没有匹配的元素... – Saravanan

相关问题