我希望你对解决这个问题的方法有什么看法。我有一个名为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。
答案 0 :(得分: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="(.*)"">
<xsl:matching-substring>
<xsl:sequence select="regex-group(1)"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
答案 1 :(得分: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
如果true()
的字符串值等于作为$myVar
元素的a
元素的字符串值,则对此XPath(1.0)表达式的求值将生成li
{1}} class
属性具有字符串值"closed"
并且是文件fileName.inc
中包含的XML文档的顶部元素的子元素的{1}}元素。
如果确实无法确定文件是否包含格式正确的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