[英]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="(.*)"">
<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=">([^<]*)</a>" 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=">([^<]*)</a>" 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.