我的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)<1 or string-length(@StrokeStartLineCap)<1 or string-length(@StrokeEndLineCap)<1 or string-length(@StrokeLineJoin)<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元素的内容答案 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-each
和choose/when
。
如果您要删除元素或属性,请使用例如<xsl:template match="foo"/>
删除完整元素,或<xsl:template match="foo"><xsl:apply-templates/></xsl:template>
仅分别处理其子节点<xsl:template match="@bar"/>
以处理bar
属性。