2012-08-15 62 views
3

我希望您的意见应该是我的方法来解决此问题。我有名字nav.inc一个文件,其中包含例如像文本:使用XSL阅读包含文件

<li class="closed"><a title="x" href="x.html">x</a></li> 
<li class="closed"><a title="y" href="y.html">y</a></li> 
<li class="closed"><a title="z" href="a.html">z</a></li> 

我要分析此文件中的XSL,这样我可以在里面a标签具有可变的每个值进行比较。条件是扩展名需要为.inc,这也意味着它不会是有效的XML。

回答

1
The condition is that the extension needs to be .inc, which also means it's not going to be a valid XML 

延伸在文件名并不意味着内容不能是格式良好的XML文档。

由于提供的示例是完整格式良好的XML片段,因此您需要安排将此片段封装到单个顶层元素中。

然后,只需使用document()功能:

$myVar = document('fileName.inc')/*/li[@class = 'closed']/a 

这个XPath(1.0)表达的评价产生true()如果$myVar字符串值等于一个a元件,其的字符串值li元素的子元素,其class属性的字符串值为"closed",该元素是文件fileName.inc中包含的XML文档的顶层元素的子元素。


如果真的不能aranged该文件包含一个格式良好的XML文档,使用unparsed-text()xsl:analyze-string

下面是一个完整变换

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:variable name="vText" select= 
     "unparsed-text('file:///c:/temp/delete/fileName.inc')"/> 

<xsl:template match="/"> 
    <xsl:analyze-string select="$vText" regex="&gt;([^&lt;]*)&lt;/a&gt;" flags="m"> 
     <xsl:matching-substring> 
     <value><xsl:value-of select="regex-group(1)"/></value> 
     </xsl:matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 
</xsl:stylesheet> 

当这种转化是在任何XML文档(未使用)施加它处理的文件:c:\temp\delete\fileName.inc其中包含所提供的文本:

<li class="closed"><a title="x" href="x.html">x</a></li> 
<li class="closed"><a title="y" href="y.html">y</a></li> 
<li class="closed"><a title="z" href="a.html">z</a></li> 

和想要的,正确的结果产生

<value>x</value> 
<value>y</value> 
<value>z</value> 

这里是如何将一个变量比较提取值:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:variable name="vText" select= 
     "unparsed-text('file:///c:/temp/delete/fileName.inc')"/> 

    <xsl:param name="vSearchValue" select="'y'"/> 
<xsl:template match="/"> 
    <xsl:variable name="vExtracted" as="element()*"> 
     <xsl:analyze-string select="$vText" regex="&gt;([^&lt;]*)&lt;/a&gt;" flags="m"> 
      <xsl:matching-substring> 
      <value><xsl:value-of select="regex-group(1)"/></value> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
    </xsl:variable> 

    <xsl:sequence select="$vSearchValue = $vExtracted"/> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是在任何XML文档(未使用)应用,在想,正确的结果产生

true 
+0

非常感谢!你们两个都是对的。 – Vinit 2012-08-20 15:33:37

+0

@Vinit,不客气。 – 2012-08-20 15:58:37

+0

你总是帮助解决XSL问题。你还能看到我今天发布的这个问题吗? http://stackoverflow.com/questions/12410876/float-image-in-pdf-using-xslfo在此先感谢! :) – Vinit 2012-09-13 18:17:07

4

随着XSLT 2.0可以使用unparsed-text()函数xsl:analyze-string加载nav.inc文件,然后解析它来建立一个变量与href值的序列:

<xsl:variable name="nav-links" as="item()*"> 
    <xsl:analyze-string select="unparsed-text('nav.inc')" regex="href=&quot;(.*)&quot;"> 
     <xsl:matching-substring> 
      <xsl:sequence select="regex-group(1)"/> 
     </xsl:matching-substring> 
    </xsl:analyze-string> 
</xsl:variable> 
+0

非常感谢!!!!! – Vinit 2012-08-18 00:06:35