3

我希望您对我解决此问题的方法有什么看法。我有一个名为 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。

4

2 回答 2

4

使用 XSLT 2.0,您可以使用该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>
于 2012-08-16T00:59:41.677 回答
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元素的子元素,并且是 XML 文档顶部元素的子元素包含在文件中。class"closed"fileName.inc


如果确实无法确定该文件包含格式良好的 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
于 2012-08-16T02:30:11.717 回答