XML к CSV с помощью справки XSLT

Я хотел бы преобразовать XML в CSV с помощью XSLT, но при применении XSL от ТАК поток названный XML К CSV XSLT против моего входа:


  127.0.0.1
  
    
      abuse@iana.org
      Internet Corporation for Assigned Names and Number
      +1-310-301-5820
    
    
    
    
    ...
    
      
4676 Admiralty Way, Suite 330
Marina del Rey US Internet Assigned Numbers Authority 90292-6695 CA
abuse@iana.org Internet Corporation for Assigned Names and Number +1-310-301-5820 2010-04-14

Я заканчиваю с:

  abuse@iana.orgInternet Corporation for Assigned Names and Number+1-310-301-5820,
    ,
    ,
    ,
    ...,      
    4676 Admiralty Way, Suite 330Marina del ReyUSInternet Assigned Numbers Authority90292-6695CA,      
    abuse@iana.orgInternet Corporation for Assigned Names and Number+1-310-301-5820,      
    2010-04-14,

Моя проблема состоит в том, что, получающееся преобразование пропускает узлы (как элемент DomainName, содержащий IP-адрес), и некоторые дочерние узлы связываются без запятых (как дети AbuseContact).

Я хотел бы видеть весь вывод XML в форме CSV и строки как: "abuse@iana.orgInternet Corporation для Корпорации по управлению доменными именами и IP-адресами и Number+1-310-301-5820", разграниченный запятыми.

Мой XSL довольно ржав. Ваша справка ценится.:)

Вот XSL, который я использую:







  
    ,    
    

  
  



6
задан Community 23 May 2017 в 12:14
поделиться

2 ответа

Это простое преобразование дает желаемый результат:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

    <xsl:template match="/">
    <xsl:apply-templates select="//text()"/>
    </xsl:template>

    <xsl:template match="text()">
      <xsl:copy-of select="."/>
      <xsl:if test="not(position()=last())">,</xsl:if>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание на использование:

 <xsl:strip-space elements="*"/>

для отбрасывания любых текстовых узлов, содержащих только белые пробелы.

Update: AJ поднял проблему, что результаты должны быть сгруппированы в рекурсии/кортежи на строку. В вопросе не определено, чем именно должна быть запись/кортеж. Поэтому текущее решение решает две проблемы: текстовые узлы только с белым пробелом и пропущенные запятые, но не нацелено на группировку результатов в записи/кортежи.

3
ответ дан 17 December 2019 в 18:11
поделиться

Я считаю, что для решения этой проблемы вам нужно рекурсивное решение. Итак, вам нужно что-то, что продолжает погружаться в дерево, пока не достигнет узла text(). Если этот узел text() на самом деле является дочерним узлом последнего узла, то он помещает новую строку. В противном случае он просто помещает значение через запятую.

Если узел не имеет узла text() в качестве своего дочернего узла, то рекурсивно начинает копаться в этом дереве.

<xsl:strip-space elements="*" />    

<xsl:template name="rec">        
    <xsl:param name="node"/>        
    <xsl:for-each select="child::*">
        <xsl:choose>
            <xsl:when test="child::text()">
                <xsl:choose>                        
                    <xsl:when test="local-name(.) != 'UpdatedDate'">"<xsl:value-of select="normalize-space(.)"/>", </xsl:when>
                    <xsl:otherwise>"<xsl:value-of select="normalize-space(.)"/>" <xsl:text>&#xD;</xsl:text></xsl:otherwise>
                </xsl:choose>                    
            </xsl:when>
            <xsl:when test="child::node()">
                <xsl:call-template name="rec">
                    <xsl:with-param name="node" select="child::node()"/>
                </xsl:call-template>                    
            </xsl:when>
        </xsl:choose>

    </xsl:for-each>
</xsl:template>

Это не является надежным доказательством, но это дало такой результат на моей стороне с Saxon:

"127.0.0.1", "abuse@iana.org", "Internet Corporation for Assigned Names and Number", "+1-310-301-5820", "...", "4676 Admiralty Way, Suite 330", "Marina del Rey", "US", "Internet Assigned Numbers Authority", "90292-6695", "CA", "abuse@iana.org", "Internet Corporation for Assigned Names and Number", "+1-310-301-5820", "2010-04-14"

Надеюсь, это поможет.

0
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: