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)式の評価では、の文字​​列値が、属性に文字列値があり、XMLドキュメントの最上位要素の子である要素の子である要素の文字列値と等しいtrue()かどうかが生成されます。ファイルに含まれています。$myVaraliclass"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 に答える