2

XSLはXMLをXMLに変換することを目的としていますが、次のようなファイルを変換できますか

line1
line 2 -- foo
line 3

の中へ

<ol>
<li>line1</li>
<li>line 2 -- foo</li>
<li>line 3</li>
</ol>

XSLTのみを使用していますか?

4

2 に答える 2

3

これはXSLT2.0では簡単で、XSLT1.0でも難しくありません

I. 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:template match="/*">
  <ol>
    <xsl:apply-templates/>
  </ol>
 </xsl:template>

 <xsl:template match="text()" name="linesToLi">
  <xsl:param name="pText" select="."/>

  <xsl:if test="string-length($pText) > 0">
      <xsl:variable name="vthisLine" select=
      "substring-before(concat($pText, '&#xA;'), '&#xA;')"/>

      <li><xsl:value-of select="$vthisLine"/></li>

      <xsl:call-template name="linesToLi">
       <xsl:with-param name="pText" select="substring-after($pText, '&#xA;')"/>
      </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメント(提供されたテキスト、単一の最上位要素にラップされて整形式のXMLドキュメントになる)に適用される場合:

<t>line1
line 2 -- foo
line 3</t>

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

<ol>
   <li>line1</li>
   <li>line 2 -- foo</li>
   <li>line 3</li>
</ol>

II。XSLT 2.0ソリューション

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

 <xsl:variable name="vText" as="xs:string">
 line1
 line 2 -- foo
 line 3
 </xsl:variable>

 <xsl:template match="/">
  <ol>
    <xsl:for-each select=
       "tokenize($vText, '\r?\n')[normalize-space()]">
      <li><xsl:sequence select="."/></li>
    </xsl:for-each>
  </ol>
 </xsl:template>
</xsl:stylesheet>

この変換がXMLドキュメント(使用されていない)に適用されると、必要な正しい結果が生成されます。

<ol>
    <li> line1</li>
    <li> line 2 -- foo</li>
    <li> line 3</li>
</ol>

注意してください

XSLT 2.0関数unparsed-text()を使用すると、任意のテキストファイルを文字列として処理し、上記のコードを使用して行に分割できます。

より正確には、次のようなものを使用します。

tokenize(unparsed-text($vSomeUrl), '\r?\n')[normalize-space()]
于 2012-04-07T16:49:41.930 に答える
1

残念ながら、XSLT 1には効率的な文字列処理および解析機能がないため、このようなタスクにはあまり適していません(可能であっても)。

XSLT 2では、これが変更されました。たとえば、XSLT2テキスト解析に関するこのペーパーを参照してください。

于 2012-04-07T11:59:48.407 に答える