2017-08-24 89 views
0

是否可以获取XSLT文件中使用的所有xPath?是否有可能获取XSLT文件的所有xPath?

例如:

XSLT文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My CD Collection</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th>Title</th> 
         <th>Artist</th> 
        </tr> 
        <xsl:for-each select="/catalog/cd"> 
         <tr> 
          <td> 
           <xsl:value-of select="title"/> 
          </td> 
          <td> 
           <xsl:value-of select="artist"/> 
          </td> 
         </tr> 
        </xsl:for-each>      
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

作为输出我希望像这样的列表:

/catalog/cd 
/catalog/cd/title 
/catalog/cd/artist 

也许通过制作自定义后处理器每次的输出线xPaths匹配/未匹配? 想法是欢迎的,因为我很无奈:) 谢谢!

+0

这会是什么目的? –

+0

我正在进行整合。在软件中,我可以定义导出数据的xml路径。在某些情况下,导出比XSLT中使用的更多的xml路径。因此,我可以看到使用哪个xPath。 – GalaxyBounce

+1

我不认为这是可能的。路径可以是相对的,并且为了使其成为绝对路径,您需要将其追加到当前上下文路径中,该路径可以位于样式表中的任何位置 - 例如可以从不同的上下文中调用相同的命名模板。 - 另外,路径是否已被实际使用取决于XML输入。 –

回答

0

您可以使用此:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="*"> 
      <xsl:for-each select="ancestor-or-self::*"> 
       <xsl:text>/</xsl:text> 
       <xsl:value-of select="local-name(.)"/> 
      </xsl:for-each> 
     <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感谢您的回应!我也是这样的解决方案,但是我得到了所有的xPath,而不仅仅是xsl中使用的那些 – GalaxyBounce

0

这是困难的,因为在XSLT模板规则匹配是非常动态的:如果你有一个调用XSL匹配=“城市”模板:应用模板,如果你有另一个match =“city”的模板,那么XSLT编译器不知道有一个路径/城市/城市。

内部Saxon有能力按照您描述的方式构建“路径映射”,它用于在XQuery中实现“文档投影”,但由于动态模板规则发送,它在XSLT中很少使用。

因此,通过静态分析来确定路径并不会让你走得很远。您还建议动态分析 - 捕获运行时访问的路径 - 也可能会引起兴趣。原则上你可以在Saxon中用TraceListener做到这一点。难点在于确定“访问”到底是什么意思 - 例如,您认为xsl:copy-of select="/"是作为访问文档中的每个节点还是只访问根节点?

相关问题