-1

xslt を使用して動的 (folder.subfolders) xml を解析する方法を教えてください。いくつか試してみましたが、まだ解決していません。私が持っているxmlの構造は次のとおりです。

<FOLDERS>
    <FOLDER>
      <FOLDERID>2edfb864-5693-4e7f-8f98-4ef6e032d8a5</FOLDERID>
      <NAME>bla</NAME>
      <FOLDERSIZE>33Kb</FOLDERSIZE>
      <LASTMODIFIED>2012-06-07 11:11:02</LASTMODIFIED>
      <SUBFOLDERS />
      <FILES>
        <FILE>
          <FILEID>1825</FILEID>
          <NAME>IMG_15052012_142711.png</NAME>
          <SIZE>33Kb</SIZE>
          <EXTENSION>png</EXTENSION>
          <LASTMODIFIED />
        </FILE>
      </FILES>
    </FOLDER>
    <FOLDER>
      <FOLDERID>c9c5e2b2-ee93-49a2-b8be-d86e41528071</FOLDERID>
      <NAME>TestFolder</NAME>
      <FOLDERSIZE>0Kb</FOLDERSIZE>
      <LASTMODIFIED>2012-06-05 00:00:00</LASTMODIFIED>
      <SUBFOLDERS>
        <FOLDER>
          <FOLDERID>3b43fe58-db85-43e6-b541-77ce250afc78</FOLDERID>
          <NAME>SubFolder</NAME>
          <FOLDERSIZE>362Kb</FOLDERSIZE>
          <LASTMODIFIED>2012-06-05 00:00:00</LASTMODIFIED>
          <SUBFOLDERS>
            <FOLDER>
              <FOLDERID>ac1d35d0-80fd-4d97-8101-4de408f24dbd</FOLDERID>
              <NAME>subsub</NAME>
              <FOLDERSIZE>0Kb</FOLDERSIZE>
              <LASTMODIFIED>2012-06-05 00:00:00</LASTMODIFIED>
              <SUBFOLDERS />
              <FILES />
            </FOLDER>
            <FOLDER>
              <FOLDERID>7cfdc199-9d0e-4f86-904d-eda3521f3e87</FOLDERID>
              <NAME>SUBSUB1</NAME>
              <FOLDERSIZE>0Kb</FOLDERSIZE>
              <LASTMODIFIED>2012-06-05 00:00:00</LASTMODIFIED>
              <SUBFOLDERS />
              <FILES />
            </FOLDER>
          </SUBFOLDERS>
          <FILES>
            <FILE>
              <FILEID>1833</FILEID>
              <NAME>Untitled.png</NAME>
              <SIZE>121Kb</SIZE>
              <EXTENSION>png</EXTENSION>
              <LASTMODIFIED />
            </FILE>
            <FILE>
              <FILEID>1834</FILEID>
              <NAME>Untitled.png</NAME>
              <SIZE>121Kb</SIZE>
              <EXTENSION>png</EXTENSION>
              <LASTMODIFIED />
            </FILE>
            <FILE>
              <FILEID>1839</FILEID>
              <NAME>Untitled.png</NAME>
              <SIZE>121Kb</SIZE>
              <EXTENSION>png</EXTENSION>
              <LASTMODIFIED />
            </FILE>
          </FILES>
        </FOLDER>
      </SUBFOLDERS>
      <FILES />
    </FOLDER>
    <FOLDER>
      <FOLDERID>1ead58e2-a412-4318-9629-d5c70d8681bc</FOLDERID>
      <NAME>TestFolder1</NAME>
      <FOLDERSIZE>241Kb</FOLDERSIZE>
      <LASTMODIFIED>2012-06-05 00:00:00</LASTMODIFIED>
      <SUBFOLDERS />
      <FILES>
        <FILE>
          <FILEID>1832</FILEID>
          <NAME>Untitled.png</NAME>
          <SIZE>121Kb</SIZE>
          <EXTENSION>png</EXTENSION>
          <LASTMODIFIED />
        </FILE>
        <FILE>
          <FILEID>1837</FILEID>
          <NAME>Untitled.png</NAME>
          <SIZE>121Kb</SIZE>
          <EXTENSION>png</EXTENSION>
          <LASTMODIFIED />
        </FILE>
      </FILES>
    </FOLDER>
  </FOLDERS>
  <FILES>
    <FILE>
      <FILEID>1836</FILEID>
      <NAME>Untitled.png</NAME>
      <SIZE>121Kb</SIZE>
      <EXTENSION>png</EXTENSION>
      <LASTMODIFIED />
    </FILE>
    <FILE>
      <FILEID>1869</FILEID>
      <NAME>WallPaper.png</NAME>
      <SIZE>7.1Mb</SIZE>
      <EXTENSION>png</EXTENSION>
      <LASTMODIFIED />
    </FILE>
  </FILES>

問題は、フォルダー/サブフォルダー ツリーがどのくらい深いかわかりません。私はすでに何かをしましたが、それはまだ静的です。動的である必要があります。特に xslt 条件の場合は選択部分です。

この場合、xml を解析する最善の方法は何だと思いますか?

これは私が持ちたい構造です:

Folders
     Subfolders       
          Subfolders 
               Subfolders
               Files
          Files
     Files 
Files  

そして、これは私が今持っているものです:

<xsl:variable name="folderRoot" select="$xml/ROOT/FOLDERS/FOLDER" />
<xsl:variable name="fileRoot" select="$xml/ROOT/FILES/FILE" />

//Loop through the root folder
<xsl:if test="count($folderRoot) &gt; 0">
  <xsl:call-template name="folder"/>
</xsl:if>

//Loop through the root files    
<xsl:if test="count($fileRoot) &gt; 0">
   <xsl:call-template name="files"/>
</xsl:if>

//files template
 <xsl:template name="files">
    <xsl:for-each select="$fileRoot">
      <tr>
        <td class="defaultIcon {EXTENSION}">
        </td>
        <td>
          <xsl:value-of select="NAME" />
        </td>
      </tr>
    </xsl:for-each>
  </xsl:template>

//Folder template
 <xsl:template name="folder">
    <xsl:for-each select="$folderRoot">
      <tr>
        <td>
          <img src="/default/components/bestandsbeheer/images/folder.png" width="16" height="16" />
        </td>
        <td>
          <xsl:value-of select="NAME"/>
        </td>
        <td> </td>
        <td>Map</td>
        <td>
          <xsl:value-of select="LASTMODIFIED" />
        </td>
      </tr>
      <!--SUBFOLDER 1 -->
      <xsl:if test="count(SUBFOLDERS/FOLDER) &gt; 0">
        <xsl:for-each select="SUBFOLDERS/FOLDER">
         <!--SUBFOLDER 2 -->
          <xsl:if test="count($folderRoot/SUBFOLDERS/FOLDER/SUBFOLDERS/FOLDER) &gt; 0">
            <xsl:for-each select="$folderRoot/SUBFOLDERS/FOLDER/SUBFOLDERS/FOLDER">
            </xsl:for-each>
          </xsl:if>
          <xsl:if test="count($folderRoot/SUBFOLDERS/FOLDER/FILES) &gt; 0">
            <xsl:for-each select="$folderRoot/SUBFOLDERS/FOLDER/FILES">
            </xsl:for-each>
          </xsl:if>
        </xsl:for-each>
      </xsl:if>

      //Files belong to a sub folder
      <xsl:if test="count(FILES) &gt; 0">
        <xsl:for-each select="FILES/FILE">

        </xsl:for-each>
      </xsl:if>

    </xsl:for-each>
  </xsl:template>

不明な点があればお知らせください。

4

2 に答える 2

0

どのような出力が必要かは明確ではありませんが、xsl:apply-templates の使用方法を学ぶ必要があります。これは、再帰降下を使用してこの種の再帰データを処理するのに最適です。あなたのスタイルシートには、次のようなテンプレート ルールが含まれていると思います。

<xsl:template match="FOLDER">
  <xsl:apply-templates select="FILES"/>
  <xsl:apply-templates select="SUBFOLDERS"/>
</xsl:template>

<xsl:template match="FILES">
  <xsl:apply-templates select="FILE"/>
</xsl:template>

<xsl:template match="SUBFOLDERS">
  <xsl:apply-templates select="FOLDER"/>
</xsl:template>

xsl:for-each と xsl:if を避けるようにしてください。これらには有効な役割がありますが、最初にテンプレート ルールと一致パターンで試してみるまで使用しないでください。これが XSLT の方法であり、実際に違いを生むのはこの種の構造のためです。

于 2012-06-12T10:12:33.680 に答える
0

このようなもの?スケルトン構造ですが、お分かりいただけると思います。

http://www.xmlplayground.com/c848Vl

于 2012-06-12T11:53:50.153 に答える