2011-04-18 65 views
2

我將項目符號項目分組並將其嵌入到某些列表元素內的項目符號列表的第二個列表中。我可以將項目分組,但我的遞歸模板正在選擇從我當前在doc中的位置到結尾的所有內容。我需要爲我的嵌套列表設置一個終點。維護嵌套元素的分組方法XSLT 2.0 - 分離多餘的元素

我的輸出是這樣的:

<ul> 
    <li>First Bullet:<ul> 
     <li>Sub-bullet 1: info for sub-bullet 
              1</li> 
     <li>Sub-bullet 2: info for sub-bullet 
              2</li> 
     <li>Sub-bullet 3: info for sub-bullet 
              3</li> 
     <li>Sub-bullet 4: info for sub-bullet 
               4</li> 
     <li>Sub-bullet 5: info for sub-bullet 
              5</li> 
     <li>Sub-bullet 6: info for sub-bullet 
              6</li> 
     </ul> 
    </li> 

    <li>Second Bullet:<ul> 
     <li>Sub-bullet 5: info for sub-bullet 
              5</li> 
     <li>Sub-bullet 6: info for sub-bullet 
              6</li> 
     </ul> 
    </li> 
</ul> 

但它應該是這樣的(無分子彈5和6的第一李下):

<ul> 
    <li>First Bullet:<ul> 
     <li>Sub-bullet 1: info for sub-bullet 
              1</li> 
     <li>Sub-bullet 2: info for sub-bullet 
              2</li> 
     <li>Sub-bullet 3: info for sub-bullet 
              3</li> 
     <li>Sub-bullet 4: info for sub-bullet 
               4</li> 
     </ul> 
    </li> 

    <li>Second Bullet:<ul> 
     <li>Sub-bullet 5: info for sub-bullet 
              5</li> 
     <li>Sub-bullet 6: info for sub-bullet 
              6</li> 
     </ul> 
    </li> 
</ul> 

我不知道怎麼樣在XSLT中正確分組子項目以使其處於正確的位置。

這裏是我的源:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<office:document-content xmlns:dom="http://www.w3.org/2001/xml-events" 
    xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
    xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
    xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" 
    xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
    xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" 
    xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
    xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
    xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
    xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"> 
    <office:body> 
    <office:presentation> 
     <draw:page draw:name="Slide1" draw:style-name="a1271" 
     draw:master-page-name="Master1-Layout3-cust-Bullet" 
     presentation:presentation-page-layout-name="Master1-PPL3"> 
     <draw:frame draw:id="id109" presentation:style-name="a1039" 
        draw:name="Content Placeholder 1" svg:x="0.31258in" svg:y="1.29095in" 
        svg:width="9.33243in" svg:height="3.8175in" presentation:class="outline" 
        presentation:placeholder="false"> 
        <draw:text-box> 
         <text:list text:style-name="a1012"> 
          <text:list-item> 
           <text:p text:style-name="a1011" text:class-names="" 
            text:cond-style-name=""><text:span text:style-name="a1010" 
             text:class-names="">First Bullet:</text:span></text:p> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1015"> 
          <text:list-item> 
           <text:list text:style-name="a1015"> 
            <text:list-item> 
             <text:p text:style-name="a1014" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1013" text:class-names="" 
               >Sub-bullet 1: info for sub-bullet 
              1</text:span></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1018"> 
          <text:list-item> 
           <text:list text:style-name="a1018"> 
            <text:list-item> 
             <text:p text:style-name="a1017" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1016" text:class-names="" 
               >Sub-bullet 2: info for sub-bullet 
              2</text:span></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1021"> 
          <text:list-item> 
           <text:list text:style-name="a1021"> 
            <text:list-item> 
             <text:p text:style-name="a1020" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1019" text:class-names="" 
               >Sub-bullet 3: info for sub-bullet 
              3</text:span></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1025"> 
          <text:list-item> 
           <text:list text:style-name="a1025"> 
            <text:list-item> 
             <text:p text:style-name="a1024" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1022" text:class-names="" 
               >Sub-bullet 4: info for sub-bullet 
               4</text:span><text:span text:style-name="a1023" 
               text:class-names=""/></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1029"> 
          <text:list-item> 
           <text:p text:style-name="a1028" text:class-names="" 
            text:cond-style-name=""><text:span text:style-name="a1026" 
             text:class-names="">Second Bullet:</text:span><text:span 
             text:style-name="a1027" text:class-names=""/></text:p> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1032"> 
          <text:list-item> 
           <text:list text:style-name="a1032"> 
            <text:list-item> 
             <text:p text:style-name="a1031" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1030" text:class-names="" 
               >Sub-bullet 5: info for sub-bullet 
              5</text:span></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1035"> 
          <text:list-item> 
           <text:list text:style-name="a1035"> 
            <text:list-item> 
             <text:p text:style-name="a1034" text:class-names="" 
              text:cond-style-name=""><text:span 
               text:style-name="a1033" text:class-names="" 
               >Sub-bullet 6: info for sub-bullet 
              6</text:span></text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
        </draw:text-box> 
        <svg:desc/> 
       </draw:frame> 
     </draw:page> 
    </office:presentation> 
    </office:body> 
</office:document-content> 

這裏是我的樣式表:

<xsl:stylesheet 
    version="2.0" 
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
    xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
    xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
    xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
    xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
    xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
    xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
    xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
    xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
    xmlns:math="http://www.w3.org/1998/Math/MathML" 
    xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
    xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
    xmlns:dom="http://www.w3.org/2001/xml-events" 
    xmlns:xforms="http://www.w3.org/2002/xforms" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" 
    office:class="text" 
    office:version="1.0" 
    exclude-result-prefixes="#all"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="draw:frame"> 
<ul> 
<xsl:for-each-group select="draw:text-box/text:list" group-starting-with="text:list-item"> 
    <xsl:for-each select="current-group()"> 

     <xsl:apply-templates select="text:list-item[not(text:list)]"/> 

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

<xsl:template match="draw:text-box/text:list/text:list-item/text:list/text:list-item/text:p"> 
<li><xsl:value-of select="."/></li> 
</xsl:template> 


<xsl:template match="draw:text-box/text:list/text:list-item/text:p"> 
<li><xsl:value-of select="."/> 
    <!-- Check for nested list --> 
    <xsl:if test="../../following-sibling::text:list[text:list-item/text:list]"> 

      <xsl:for-each select="current-group()"> 
      <xsl:apply-templates select="text:list-item/text:p"/> 
      </xsl:for-each> 

      </xsl:for-each-group> 
    </ul> 
    </xsl:if> 
</li> 
</xsl:template> 


</xsl:stylesheet> 

如何在2.0做到這一點有什麼建議?我試圖創建一些計數變量,但是在當前組環境之外建立一個端點還沒有任何運氣。我知道必須有一個明顯的(更優雅的)方式來完成這件事。

+0

好問題,+1。看到我的答案是一個完整的,簡短的解決方案:) – 2011-04-19 03:19:34

回答

0

有一個簡短而簡單的解決方案,不需要XSLT 2。0在所有:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
exclude-result-prefixes="text" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="text:list"> 
    <ul><xsl:apply-templates/></ul> 
</xsl:template> 

<xsl:template match="text:list-item[not(text:list)]"> 
    <li><xsl:apply-templates/></li> 
</xsl:template> 

<xsl:template match= 
    "text()[not(ancestor::text:list-item)]"/> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<office:document-content xmlns:dom="http://www.w3.org/2001/xml-events" 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"> 
    <office:body> 
     <office:presentation> 
      <draw:page draw:name="Slide1" draw:style-name="a1271"   draw:master-page-name="Master1-Layout3-cust-Bullet"   presentation:presentation-page-layout-name="Master1-PPL3"> 
       <draw:frame draw:id="id109" presentation:style-name="a1039"      draw:name="Content Placeholder 1" svg:x="0.31258in" svg:y="1.29095in"      svg:width="9.33243in" svg:height="3.8175in" presentation:class="outline"      presentation:placeholder="false"> 
        <draw:text-box> 
         <text:list text:style-name="a1012"> 
          <text:list-item> 
           <text:p text:style-name="a1011" text:class-names=""          text:cond-style-name=""> 
            <text:span text:style-name="a1010"           text:class-names="">First Bullet:</text:span> 
           </text:p> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1015"> 
          <text:list-item> 
           <text:list text:style-name="a1015"> 
            <text:list-item> 
             <text:p text:style-name="a1014" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1013" text:class-names=""             >Sub-bullet 1: info for sub-bullet            1</text:span> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1018"> 
          <text:list-item> 
           <text:list text:style-name="a1018"> 
            <text:list-item> 
             <text:p text:style-name="a1017" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1016" text:class-names=""             >Sub-bullet 2: info for sub-bullet            2</text:span> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1021"> 
          <text:list-item> 
           <text:list text:style-name="a1021"> 
            <text:list-item> 
             <text:p text:style-name="a1020" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1019" text:class-names=""             >Sub-bullet 3: info for sub-bullet            3</text:span> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1025"> 
          <text:list-item> 
           <text:list text:style-name="a1025"> 
            <text:list-item> 
             <text:p text:style-name="a1024" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1022" text:class-names=""             >Sub-bullet 4: info for sub-bullet             4</text:span> 
              <text:span text:style-name="a1023"             text:class-names=""/> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1029"> 
          <text:list-item> 
           <text:p text:style-name="a1028" text:class-names=""          text:cond-style-name=""> 
            <text:span text:style-name="a1026"           text:class-names="">Second Bullet:</text:span> 
            <text:span           text:style-name="a1027" text:class-names=""/> 
           </text:p> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1032"> 
          <text:list-item> 
           <text:list text:style-name="a1032"> 
            <text:list-item> 
             <text:p text:style-name="a1031" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1030" text:class-names=""             >Sub-bullet 5: info for sub-bullet            5</text:span> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
         <text:list text:style-name="a1035"> 
          <text:list-item> 
           <text:list text:style-name="a1035"> 
            <text:list-item> 
             <text:p text:style-name="a1034" text:class-names=""            text:cond-style-name=""> 
              <text:span             text:style-name="a1033" text:class-names=""             >Sub-bullet 6: info for sub-bullet            6</text:span> 
             </text:p> 
            </text:list-item> 
           </text:list> 
          </text:list-item> 
         </text:list> 
        </draw:text-box> 
        <svg:desc/> 
       </draw:frame> 
      </draw:page> 
     </office:presentation> 
    </office:body> 
</office:document-content> 

有用,正確的結果產生

<ul> 
    <li>First Bullet:</li> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 1: info for sub-bullet            1</li> 
    </ul> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 2: info for sub-bullet            2</li> 
    </ul> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 3: info for sub-bullet            3</li> 
    </ul> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 4: info for sub-bullet             4</li> 
    </ul> 
</ul> 
<ul> 
    <li>Second Bullet:</li> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 5: info for sub-bullet            5</li> 
    </ul> 
</ul> 
<ul> 
    <ul> 
     <li>Sub-bullet 6: info for sub-bullet            6</li> 
    </ul> 
</ul> 

和瀏覽器將其顯示爲

  • 首先子彈:
    • 子子彈1:用於子子彈信息1
    • 子子彈2:副信息-bullet 2
    • 子彈頭3:用於子子彈信息3
    • 子子彈4:用於子子彈信息4
  • 第二子彈:
    • 子子彈5:用於子子彈信息5
    • 子子彈6:用於子子彈6信息
+0

感謝您的回答。有什麼方法可以將ul標籤嵌入到第一級li中?您的解決方案適用於html,但我的內容具有不允許這樣做的驗證規則。所以我只能使用'

  • 第一個子彈:
      ...子彈...
'在第一級鋰標籤。如果這無法在第一時間完成,也許我可以構建第二個樣式表,以某種方式組織正確的嵌套結構。對於遲到的反應抱歉,我出去度假。 – 2011-04-20 02:40:18

+0

@unknown_varmit:很抱歉,您的XML文檔非常複雜,我無法在此上花費大量時間。如果你可以提供最簡單的例子,它沒有多餘的元素,並且不需要水平滾動,那麼可以做一些事情。這個任務可能並不難,但是這裏的難點來自奇怪的XML文檔。處理它的最佳方式是閉着眼睛。 – 2011-04-20 03:04:43

0

您需要一個匹配文本列表的模板;這將輸出< ul>標籤。