2016-11-25 56 views
0

我有一個XML看起來像這樣:XSL - 更換標籤的所有實例與另一個遞歸

<Viewbox Width="29.513" Height="57.478" 
    > 
    <Canvas> 
    <Canvas> 
    <!-- Layer 1/<Group>/<Group>/<Compound Path> --> 
    <Path Fill="#ffffffff" Data="F1... Z"/> 
    <Path StrokeThickness="0.9" Stroke="#ff59595b" StrokeStartLineCap="Round" StrokeEndLineCap="Round" StrokeLineJoin="Round" Data="F1 ...698"/> 
    </Canvas> 
    </Canvas> 


</Viewbox> 

我的XSL是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/" > 
    <DrawImage> 
     <xsl:for-each select="//Canvas"> 
     <DrawingGroup><xsl:copy-of select="child::*" /></DrawingGroup> 
    </xsl:for-each> 
     <xsl:for-each select="//Path"> 
     <GeometryDrawing> 
<xsl:choose> 
    <xsl:when test="@Fill">   
     <xsl:attribute name="Brush"> 
      <xsl:value-of select="@Fill"/> 
     </xsl:attribute> 
     </xsl:when> 
    <xsl:when test="@Stroke">   
     <xsl:attribute name="Brush"> 
      <xsl:value-of select="@Stroke"/> 
     </xsl:attribute> 
     </xsl:when> 
    </xsl:choose> 
     <xsl:attribute name="Geometry"> 
      <xsl:value-of select="@Data"/> 
     </xsl:attribute> 
     <xsl:choose> 
    <xsl:when test="not(string-length(@StrokeThickness)&lt;1 or string-length(@StrokeStartLineCap)&lt;1 or string-length(@StrokeEndLineCap)&lt;1 or string-length(@StrokeLineJoin)&lt;1)">  
     <Pen> 
<xsl:choose> 
    <xsl:when test="@StrokeThickness">   
      <xsl:attribute name="Thickness"> 
      <xsl:value-of select="@StrokeThickness"/> 
      </xsl:attribute> 
     </xsl:when> 
    </xsl:choose>  
<xsl:choose> 
    <xsl:when test="@StrokeStartLineCap"> 
     <xsl:attribute name="StartLineCap"> 
      <xsl:value-of select="@StrokeStartLineCap"/> 
      </xsl:attribute> 
       </xsl:when> 
    </xsl:choose> 
    <xsl:choose> 
    <xsl:when test="@StrokeEndLineCap"> 
     <xsl:attribute name="EndLineCap"> 
      <xsl:value-of select="@StrokeEndLineCap"/> 
      </xsl:attribute> 
       </xsl:when> 
    </xsl:choose> 
     <xsl:choose> 
    <xsl:when test="@StrokeLineJoin"> 
     <xsl:attribute name="LineJoin"> 
      <xsl:value-of select="@StrokeLineJoin"/> 
      </xsl:attribute> 
       </xsl:when> 
    </xsl:choose> 
     </Pen> 
     </xsl:when> 
    </xsl:choose>  
     </GeometryDrawing> 
     </xsl:for-each> 
    </DrawImage> 
    </xsl:template> 
</xsl:stylesheet> 

的東西是不正確的。我的輸出是假設看起來像下圖所示,但是取而代之,我得到了DrawingGroup之外的幾何圖形,而DrawingGroup沒有像Canvas那樣嵌套。

<?xml version="1.0" encoding="utf-8" ?> 
<DrawImage> 
    <DrawingGroup> 
    <DrawingGroup> 
    <GeometryDrawing Brush="#ffffffff" Geometry="F1....478 Z" /> 
    <GeometryDrawing Brush="#ff59595b" Geometry="F1...98"> 
    <Pen Thickness="0.9" StartLineCap="Round" EndLineCap="Round" LineJoin="Round" /> 
    </GeometryDrawing> 
    </DrawingGroup> 
    </DrawingGroup> 
</DrawImage> 

我希望有人能告訴我該怎麼把我的DrawingGroup元素在裏面我的XSL

+0

Path-> GeometryDrawing轉換工作正常 - 它只是Canvas-> DrawingGroup失敗 – h607732

回答

0

使用模板例如

<xsl:template match="Canvas"> 
    <DrawingGroup> 
    <xsl:apply-templates select="@* | node()"/> 
    </DrawingGroup> 
</xsl:template> 

然後可以很容易地編寫將每個元件可以根據需要,保持原始文檔結構模塊化的代碼。

你只需要添加更多的模板像

<xsl:template match="@Fill"> 
    <xsl:attribute name="Brush" select="."/><!-- XSLT 2.0 --> 
    <!-- or XSLT 1.0 <xsl:attribute name="Brush"><xsl:value-of select="."/></xsl:attribute>--> 
</xsl:template> 

無需for-eachchoose/when

如果存在要刪除的元素或屬性,則使用例如<xsl:template match="foo"/>刪除完整元素或<xsl:template match="foo"><xsl:apply-templates/></xsl:template>以分別僅處理其子節點<xsl:template match="@bar"/>而不處理bar屬性。

+0

我試圖擁有一個額外的模板,就像您描述的模板一樣,但是完全刪除了Canvas/DrawingGroup標記... 或者,我應該如何將更改爲路徑上的模板匹配? – h607732

+0

啊....試過了....而且它似乎工作 我現在有: 的 .... 這似乎工作! 感謝您的時間 – h607732

+0

我的建議是爲了改變整個使用模板匹配和apply-templates的方法,這樣保留了文檔結構。所以你不需要你顯示的模板,而是從例如''。 –

相關問題