簡體   English   中英

使用XSL讀取包含文件

[英]Read an include file using XSL

我希望你對解決這個問題的方法有什么看法。 我有一個名為nav.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>

我想在xsl中解析這個文件,以便我可以將標記內a每個值與變量進行比較。 條件是擴展名必須是.inc ,這也意味着它不會是有效的XML。

使用XSLT 2.0,您可以使用nav.inc unparsed-text()函數加載nav.inc文件,然后使用xsl:analyze-string解析它以構建具有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>
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

如果$myVar的字符串值等於a元素的字符串值,則該XPath(1.0)表達式的計算結果為true() ,該元素是一個li元素的子元素,其class屬性的字符串值為"closed" ,並且是文件fileName.inc包含的XML文檔的頂部元素的子元素。


如果確實無法確定文件是否包含格式良好的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM