Добавьте запятую в качестве разделителя при создании массива массивов в виде одного поля в CSV из данных XML с использованием xslt - PullRequest
0 голосов
/ 30 мая 2018

Мои фактические данные выглядят следующим образом:

<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(',','&#xA;')"/>
        </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],] Справа

Пожалуйста, помогите мне убрать двойные кавычки и последний COMMA в поле data .

1 Ответ

0 голосов
/ 30 мая 2018

Если вы можете использовать только 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&#10;</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&#10;</xsl:text>
</xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: Мне интересно, действительно ли вы используете XSLT 2.0.Простое помещение version="2.0" в таблицу стилей ничего не даст, если у вас не поддерживается процессор XSLT.

Если это так, вот версия XSLT 1.0 предыдущего XSLT

<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&#10;</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&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

Вы должны быть в состоянии адаптировать его к новому XML.

Примечание. Чтобы узнать, какой процессор и версия XSLT у вас есть на самом деле, посмотрите этот вопрос ...

Как я могу проверить, какой процессор XSLT используется в Solr?

...