2012-08-15 61 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