【问题标题】:Read an include file using XSL使用 XSL 读取包含文件
【发布时间】:2012-08-15 18:39:20
【问题描述】:

我希望您能就我解决此问题的方法提出意见。我有一个名为 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。

【问题讨论】:

    标签: xml xslt xml-parsing xslt-2.0


    【解决方案1】:

    在 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>
    

    【讨论】:

      【解决方案2】:
      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) 表达式的求值将产生li 的子元素li 的子元素@987654331 @ 属性具有字符串值 "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
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多