0

すでに入力 XML がある

<tutorial>
<lessons>
<lesson>
     chapter1 unit 1 page1
</lesson>
<lesson>
     unit 1 
</lesson>
</lessons>
</tutorial>

出力は

<Geography>
<historical>
    <social>
       <toc1>
     <toc>
      <chapter>
    chapter1
      <chapter>
      <unit>
    unit 1
      </unit>
      <pages>
    page1
      </pages>
      </toc>
       </toc1>
    <social>
</historical>

実際、私はここで混乱しています

 <lesson>
chapter1 unit 1 page1
</lesson>
<lesson>
 unit 1 
</lesson>

ここで私は2つのアウトパスが必要です

最初のレッスンでは、上記の出力のように必要です

2番目のレッスンでは、以下のような出力として必要です

 <historical>
    <social>
       <toc1>
  <toc>
      <unit>
    unit 1
      </unit>   
  <toc>
       </toc1>
    <social>
</historical>

しかし、時々私はxmlで両方のタイプを取得します。これを行う方法が完全に混乱しています。

XSLT1.0 と XSLT2.0 の両方で使用できます。

よろしくカーシック

4

1 に答える 1

1

この 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:strip-space elements="*"/>

  <xsl:variable name="vNames" select="'chapter', 'unit', 'pages'"/>

 <xsl:template match="lessons">
    <Geography>
      <historical>
        <social>
           <toc1>
             <xsl:apply-templates/>
           </toc1>
        </social>
      </historical>
    </Geography>
 </xsl:template>

 <xsl:template match="lesson[matches(., '(chapter\s*\d+)?\s+(unit\s*\d+)\s+(page\s*\d+)?')]">
  <xsl:analyze-string select="."
   regex="(chapter\s*\d+)?\s+(unit\s*\d+)\s+(page\s*\d+)?">
    <xsl:matching-substring>
      <toc>
         <xsl:for-each select="1 to 3">
          <xsl:if test="regex-group(current())">
           <xsl:element name="{$vNames[current()]}">
                <xsl:sequence select="regex-group(current())"/>
           </xsl:element>
          </xsl:if>
         </xsl:for-each>
      </toc>
    </xsl:matching-substring>
  </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<tutorial>
    <lessons>
    <lesson>
         chapter1 unit 1 page1
    </lesson>
    <lesson>
         unit 1
    </lesson>
    </lessons>
</tutorial>

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

<Geography>
  <historical>
    <social>
      <toc1>
        <toc>
          <chapter>chapter1</chapter>
          <unit>unit 1</unit>
          <pages>page1</pages>
        </toc>
        <toc>
          <unit>unit 1</unit>
        </toc>
      </toc1>
    </social>
  </historical>
</Geography>

説明:

次のような XSLT 2.0 正規表現機能の適切な使用:

  1. および<xsl:analyze-string>命令<xsl:matching-substring>

  2. regex-group()関数。

于 2012-07-13T13:25:28.440 に答える