XSL - 用递归的另一个

时间:2016-11-25 09:46:20

标签: xml xslt

我的XML看起来像这样:

<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之外的Geometrydrawings,并且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>

我希望有人可以告诉我在xsl

中放入DrawingGroup元素的内容

1 个答案:

答案 0 :(得分: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属性。