0

次のnav.incファイルがあります。

<a href="/index.html" rel="external" ><img src="/images/ns.png" alt="Sample Page"/><span class="title" >Demo</span></a>
<a href="/demo.html" rel="external" ><img src="/images/missions.png" alt="Sample Page"/><span class="title" >Demo2</span></a>
<a href="/mobile.html" rel="external" ><img src="/images/ons.png" alt="Sample Page"/><span class="title" >Demo3</span></a>
.
.
.

等々

XSLを介してこれらの各リスト要素のノードと@hrefの値を取得し、次のような構造を構築したいと思います。

<li><a href="/index.html" rel="external">Demo</a></li>
.
.

私はこれが次のようにできることを知っています:

<xsl:variable name="vText" select="unparsed-text('nav.inc')"/> 

と似たようなもの:

<xsl:variable name="vExtracted" as="xs:token*">
  <xsl:analyze-string select="$vText" regex="" flags="m">
    <xsl:matching-substring>
      <xsl:value-of select="regex-group(1)"/>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:variable>

そして

<xsl:for-each select="$vExtracted">
  <li><xsl:value-of select="."/></li>
</xsl:for-each >

私は正規表現が苦手です。この問題に取り組むための助けは大歓迎です。

4

4 に答える 4

2

入力が提案したとおりに規則的である場合は、自分で解析する手間をかける必要はありません。XMLパーサーを使用するとはるかに簡単に入力できます。(そして、それがあなたが提案するほど定期的でないなら、あなたは面倒を望んでいません...)。唯一のわずかな障害は、最も外側の要素を囲んでいないことです。これは、提供されたテキストを内に連結する<o>...</o>か、外部の解析済みエンティティとしてラッパーXMLドキュメントに含めることで簡単に解決できます。

変換は、ワンライナーに到達するのと同じくらい近くなります。

<xsl:template match="a">
  <li><a href="{@href}" rel="{@rel}"><xsl:value-of select="."/></a></li>
</xsl:template>
于 2013-01-09T09:02:07.687 に答える
1

この質問があなたにとって最良の答えであると言っても過言ではないと思います。XMLパーサーを使用します。

あなたのケースが本当に単純で、次の方法で解決できる場合:

<a href="(.*?)" rel="external" ><img src=".*?" alt="Sample Page"/><span class="title" >(.*?)</span></a>

これは、サンプルで検索と置換を実行し、置換すると次のようになります$1,$2

/index.html,Demo
/demo.html,Demo2
/mobile.html,Demo3

その場合はおそらくですが、サンプルが示すよりもはるかに複雑な考慮事項がある場合、正規表現はHTMLを解析できません。

于 2013-01-08T23:22:42.807 に答える
1

XSLT 2.0プロセッサによっては、拡張関数を使用してunparsed-text(要素をラップして整形式にする)を解析し、正規表現をまったく使用しない場合があります...

nav.inc

<a href="/index.html" rel="external" ><img src="/images/ns.png" alt="Sample Page"/><span class="title" >Demo</span></a>
<a href="/demo.html" rel="external" ><img src="/images/missions.png" alt="Sample Page"/><span class="title" >Demo2</span></a>
<a href="/mobile.html" rel="external" ><img src="/images/ons.png" alt="Sample Page"/><span class="title" >Demo3</span></a>

XSLT 2.0(Saxon-EE 9.4でテストされ、それ自体を入力として使用)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="nav.inc">
        <xsl:text>&lt;doc></xsl:text>
        <xsl:value-of select="unparsed-text('file:///C:/so_test/nav.inc')"/>
        <xsl:text>&lt;/doc></xsl:text>
    </xsl:variable>

    <xsl:template match="/">
        <results>
            <xsl:for-each select="saxon:parse($nav.inc)/*/a">
                <li>
                    <xsl:copy>
                        <xsl:copy-of select="@*"/>
                        <xsl:value-of select="."/>
                    </xsl:copy>
                </li>
            </xsl:for-each>
        </results>
    </xsl:template>

</xsl:stylesheet>

XML出力

<results>
   <li>
      <a href="/index.html" rel="external">Demo</a>
   </li>
   <li>
      <a href="/demo.html" rel="external">Demo2</a>
   </li>
   <li>
      <a href="/mobile.html" rel="external">Demo3</a>
   </li>
</results>

より複雑な変換を行う場合は、別のテンプレートを使用してxsl:apply-templates( )としても機能します。<xsl:apply-templates select="saxon:parse($nav.inc)/*"/>a

于 2013-01-09T04:38:07.257 に答える
0
      <xsl:variable name="vText" select="unparsed-text($source1,$encoding)"/>
          <xsl:variable name="vExtracted" as="element(group)*">
            <xsl:analyze-string select="$vText" regex="&#34;([^&lt;]*)&quot; rel(.*)&gt;([^&lt;]*)&lt;/span&gt;" flags="m">
              <xsl:matching-substring>
                 <group>
                     <x><xsl:value-of select="regex-group(1)"/></x>
                     <y><xsl:value-of select="regex-group(3)"/></y>
                  </group>
              </xsl:matching-substring>
            </xsl:analyze-string>
          </xsl:variable>


          <xsl:for-each select="$vExtracted">
          &lt;li&gt;&lt;a href="<xsl:value-of select="x"/>".*&gt;<xsl:value-of select="y"/>&lt;/a&gt;&lt;/li&gt;
          </xsl:for-each >
于 2013-01-09T01:27:47.047 に答える