使用 xslt 从 xml 数据创建数组数组作为 csv 中的一个字段时添加逗号作为分隔符
Add comma as delimiter when creating array of arrays as one field in csv from xml data using xslt
我的实际数据如下:
<image name="101272.dcm">
<gobject type="Right"><polyline><vertex index="0" t="0.0" x="636.0" y="1920.0" z="0.0"/><vertex index="1" t="0.0" x="604.0" y="2296.0" z="0.0"/></polyline></gobject>
</image>
<image name="101280.dcm">
<gobject type="Right"><polyline><vertex index="0" t="0.0" x="1776.0" y="392.0" z="0.0"/><vertex index="1" t="0.0" x="1456.0" y="424.0" z="0.0"/></polyline></gobject>
</image>
我成功提取了所有其他需要的数据。但是使用逗号作为分隔符是痛苦的,因为我是 xslt 的初学者。
我使用的是 xslt 版本 2,我的代码是:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
seriesUID,annotationType,coordSys,data,name,label
<xsl:for-each select="//gobject">
<xsl:variable name="seriesUID" select="ancestor::image/@name"/>
<xsl:value-of select="substring-before($seriesUID,'.dcm')"/>
<xsl:value-of select="concat(',','polygon')"/>
<xsl:value-of select="@annotationType"/>
<xsl:value-of select="concat(',','Image')"/>
<xsl:value-of select="@coordSys"/>
<xsl:value-of select="concat(',','[')"/>
<xsl:for-each select="polyline/vertex">
<xsl:value-of select="concat('','[')"/>
<xsl:value-of select="@x"/>
<xsl:value-of select="@y"/>
<xsl:value-of select="@z"/>
<xsl:value-of select="concat(']','')"/>
</xsl:for-each>
<xsl:value-of select="concat(']','',',')"/>
<xsl:value-of select="@type"/>
<xsl:value-of select="concat(',','')"/>
<xsl:value-of select="@label"/>
<xsl:value-of select="concat(',','
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
生成以下输出:
seriesUID annotationType coordSys data name label
1006780多边形图片[[[3476.0,1196.0,0.0],[3436.0,1036.0,0.0],]右
1006810多边形图片[[3064.0,744.0,0.0],[3300.0,912.0,0.0],]右
请帮我去掉data.
字段中的双引号和最后一个逗号
如果您只能使用 XSLT 2.0,那么您可以这样做...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text>type,data,label </xsl:text>
<xsl:apply-templates select="//parent" />
</xsl:template>
<xsl:template match="parent">
<xsl:value-of select="@type" />
<xsl:text>,"[</xsl:text>
<xsl:value-of select="child1/child2/concat('[',@x,',',@y,',',@z,']')" separator="," />
<xsl:text>]",hard coded </xsl:text>
</xsl:template>
</xsl:stylesheet>
编辑:我想知道您是否确实在使用 XSLT 2.0。除非您有支持它的 XSLT 处理器,否则简单地将 version="2.0"
放入样式表将无法实现任何效果。
如果是这种情况,这里是之前 XSLT 的 XSLT 1.0 版本
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text>type,data,label </xsl:text>
<xsl:apply-templates select="//parent" />
</xsl:template>
<xsl:template match="parent">
<xsl:value-of select="@type" />
<xsl:text>,"[</xsl:text>
<xsl:for-each select="child1/child2">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('[',@x,',',@y,',',@z,']')" />
</xsl:for-each>
<xsl:text>]",hard coded </xsl:text>
</xsl:template>
</xsl:stylesheet>
你应该能够适应你的新 XML 希望。
注意:要查看您实际拥有的 XSLT 处理器和版本,请参阅此问题...
How can I check which XSLT processor is being used in Solr?
我的实际数据如下:
<image name="101272.dcm">
<gobject type="Right"><polyline><vertex index="0" t="0.0" x="636.0" y="1920.0" z="0.0"/><vertex index="1" t="0.0" x="604.0" y="2296.0" z="0.0"/></polyline></gobject>
</image>
<image name="101280.dcm">
<gobject type="Right"><polyline><vertex index="0" t="0.0" x="1776.0" y="392.0" z="0.0"/><vertex index="1" t="0.0" x="1456.0" y="424.0" z="0.0"/></polyline></gobject>
</image>
我成功提取了所有其他需要的数据。但是使用逗号作为分隔符是痛苦的,因为我是 xslt 的初学者。
我使用的是 xslt 版本 2,我的代码是:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
seriesUID,annotationType,coordSys,data,name,label
<xsl:for-each select="//gobject">
<xsl:variable name="seriesUID" select="ancestor::image/@name"/>
<xsl:value-of select="substring-before($seriesUID,'.dcm')"/>
<xsl:value-of select="concat(',','polygon')"/>
<xsl:value-of select="@annotationType"/>
<xsl:value-of select="concat(',','Image')"/>
<xsl:value-of select="@coordSys"/>
<xsl:value-of select="concat(',','[')"/>
<xsl:for-each select="polyline/vertex">
<xsl:value-of select="concat('','[')"/>
<xsl:value-of select="@x"/>
<xsl:value-of select="@y"/>
<xsl:value-of select="@z"/>
<xsl:value-of select="concat(']','')"/>
</xsl:for-each>
<xsl:value-of select="concat(']','',',')"/>
<xsl:value-of select="@type"/>
<xsl:value-of select="concat(',','')"/>
<xsl:value-of select="@label"/>
<xsl:value-of select="concat(',','
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
生成以下输出:
seriesUID annotationType coordSys data name label
1006780多边形图片[[[3476.0,1196.0,0.0],[3436.0,1036.0,0.0],]右
1006810多边形图片[[3064.0,744.0,0.0],[3300.0,912.0,0.0],]右
请帮我去掉data.
字段中的双引号和最后一个逗号如果您只能使用 XSLT 2.0,那么您可以这样做...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text>type,data,label </xsl:text>
<xsl:apply-templates select="//parent" />
</xsl:template>
<xsl:template match="parent">
<xsl:value-of select="@type" />
<xsl:text>,"[</xsl:text>
<xsl:value-of select="child1/child2/concat('[',@x,',',@y,',',@z,']')" separator="," />
<xsl:text>]",hard coded </xsl:text>
</xsl:template>
</xsl:stylesheet>
编辑:我想知道您是否确实在使用 XSLT 2.0。除非您有支持它的 XSLT 处理器,否则简单地将 version="2.0"
放入样式表将无法实现任何效果。
如果是这种情况,这里是之前 XSLT 的 XSLT 1.0 版本
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text>type,data,label </xsl:text>
<xsl:apply-templates select="//parent" />
</xsl:template>
<xsl:template match="parent">
<xsl:value-of select="@type" />
<xsl:text>,"[</xsl:text>
<xsl:for-each select="child1/child2">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('[',@x,',',@y,',',@z,']')" />
</xsl:for-each>
<xsl:text>]",hard coded </xsl:text>
</xsl:template>
</xsl:stylesheet>
你应该能够适应你的新 XML 希望。
注意:要查看您实际拥有的 XSLT 处理器和版本,请参阅此问题...
How can I check which XSLT processor is being used in Solr?