3

順序付きリストを除いてすべてが適切に構造化されたXMLファイルがあります。すべてのリストアイテムは段落としてタグ付けされ<p>、列挙は手動で追加されます:(1)。そのソースから有効なHTMLリストを作成したいと思います。

メソッドと正規表現を使用して、すべてのリストアイテムを抽出できましたが、周囲のタグxsl:matching-substringを追加する方法が見つからないようです。<ol>

次に例を示します。

XMLソース:

<Content>
    <P>(1) blah</P>
    <P>(2) blah</P>
    <P>(2) blah</P>
</Content>

私がこれまでに持っているもの:

<xsl:variable name="text" select="/Content/*/text()"/>
<xsl:analyze-string select="$text" regex="(\(\d+\))([^(]*)">
    <xsl:matching-substring>    
        <![CDATA[<li>]]><xsl:value-of select="regex-group(2)"/><![CDATA[</li>]]>
    </xsl:matching-substring>
</xsl:analyze-string>

出力:

<li>blah</li>
<li>blah</li>
<li>blah</li>

ご参考までに、出力は一般にプレーンテキストである$text必要があり、変数の内容のみをHTMLで出力する必要があります。だから私はを使用して<![CDATA[]]います。

4

2 に答える 2

3

これと同じくらい簡単です:

I. XSLT 2.0ソリューション:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <ol>
    <xsl:apply-templates/>
  </ol>
 </xsl:template>

 <xsl:template match="P[matches(., '(^\(\d+\)\s*)(.*)')]">
    <li>
        <xsl:analyze-string select="." regex="(^\(\d+\)\s*)(.*)">
            <xsl:matching-substring>
              <xsl:value-of select="regex-group(2)"/>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </li>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<Content>
    <P>(1) blah</P>
    <P>(2) blah</P>
    <P>(2) blah</P>
</Content>

必要な正しい結果が生成されます。

<ol>
    <li>blah</li>
    <li>blah</li>
    <li>blah</li>
</ol>

II。XSLT 1.0ソリューション

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <ol>
    <xsl:apply-templates/>
  </ol>
 </xsl:template>

 <xsl:template match=
  "P[starts-with(.,'(')
   and
     floor(substring-before(substring(.,2), ')'))
    =
     substring-before(substring(.,2), ')')
    ]">
    <li>
         <xsl:value-of select="substring-after(., ') ')"/>
    </li>
 </xsl:template>
</xsl:stylesheet>

この変換が同じXMLドキュメント(上記)に適用されると、同じ正しい結果が生成されます。

<ol>
   <li>blah</li>
   <li>blah</li>
   <li>blah</li>
</ol>
于 2012-11-18T21:58:22.343 に答える
0

これは実際には解決策ではありませんが、Dimitreの解決策のわずかな改善が提案されています。

(1)XSLT2.0ソリューションのテンプレート一致条件は次のように簡略化できます...

<xsl:template match="P[matches(., '^\(\d+\)')]">

そうは言っても、xsl:analyze-stringの正規表現はそのままにしておく必要があります。

(2)おそらく、これは質問の範囲外ですが、質問はhtmlが意図された出力であるように読み取られるため、html xsl:outputメソッドをOPに提案する必要があります。

于 2012-11-19T04:22:01.743 に答える