xslt пропустить схему в наборе строк

У меня есть следующие вопросы или проблемы с моим XSL ниже. Я включил мой текущий вывод, XML и XSL. У меня возникают проблемы при попытке удалить 2-ю строку, содержащую двойные кавычки. Я предполагаю, что это исходит из узла схемы.

1) самая близкая версия my xsl помещает недопустимую строку между заголовками и данными, как показано в примере ниже.
2) Я пытался вставить этот шаблон "" перед вторым шаблоном, чтобы удалить пустую строку, вызванную узлом схемы, но это не имело никакого эффекта
3) Я попытался изменить 2-й шаблон, чтобы он выглядел так: 1] / child:: ">, но это испортило форматирование моих данных. Я не совсем понимаю, почему, потому что>0 работает нормально.
4 Я также попытался изменить второй шаблон с вариациями match="Row/child::, но это также испортило формат данных. Любая помощь очень ценится.

Текущие результаты:

"Column0", "Column1", "Column2", "Column3"
""
"0",    "2010",    "336227.46",    "1.43075514893617"
"0",    "2011",    "782819.36",    "3.40356243478261"
"0",    "2012",    "783044.89",    "3.33210591489362"

Исходный XML:

<rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" >
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset">
        <xsd:complexType name="Row">
            <xsd:sequence>
                <xsd:element name="Column0" type="xsd:int" minOccurs="0" maxOccurs="1" saw-sql:type="integer" saw-sql:displayFormula="s_0" />
                <xsd:element name="Column1" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:displayFormula="s_1" />
                <xsd:element name="Column2" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:displayFormula="s_2" />
                <xsd:element name="Column3" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:displayFormula="s_3" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
    <Row>
        <Column0>0</Column0>
        <Column1>2010</Column1>
        <Column2>336227.46</Column2>
        <Column3>1.43075514893617</Column3>
    </Row>
    <Row>
        <Column0>0</Column0>
        <Column1>2011</Column1>
        <Column2>782819.36</Column2>
        <Column3>3.40356243478261</Column3>
    </Row>
    <Row>
        <Column0>0</Column0>
        <Column1>2012</Column1>
        <Column2>783044.89</Column2>
        <Column3>3.33210591489362</Column3>
    </Row>
</rowset>

Версия кода - ближайшая

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
    xmlns:err="http://www.w3.org/2005/xqt-errors"
    exclude-result-prefixes="xs xdt err fn">

    <xsl:output method="text" indent="yes"/>

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

<xsl:template match="/*">
<xsl:for-each select="*[2]/*">
<xsl:text>"</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>"</xsl:text>
<xsl:if test="position() != last()">, </xsl:if>
<xsl:if test="position() = last()">
<xsl:text>&#xD;&#xA;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>


<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(.)"/>",    </xsl:if>
<xsl:if test="position()  = last()">"<xsl:value-of select="normalize-space(.)"/>"<xsl:text>&#xD;&#xA;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

1 ответ

Решение

Дополнительная строка вызвана тем, что вы применили шаблоны ко всем дочерним элементам корневого элемента. Это включает в себя xsd:schema узел.

Вы можете предотвратить это, изменив:

<xsl:apply-templates/>

в строке № 23:

<xsl:apply-templates select="*[position() gt 1]"/>

PS Я бы предложил вам использовать явные имена для адресации исходных XML-узлов, а не такие загадочные сокращения, как *[2]/*, Это сделает ваш код более читабельным и, как следствие, более простым в управлении.

Другие вопросы по тегам