xslt 跳过行集中的架构
xslt skip schema in rowset
我对下面的 xsl 有以下疑问或问题。我已经包括了我当前的输出,xml 和 xsl。我在尝试删除包含双引号的第二行时遇到问题。我假设它来自模式节点。
1) 最接近的版本我的 xsl 在标题和数据之间放置了一个无效行,如下例所示。
2) 我尝试在第二个模板之前插入此模板“”以删除由模式节点引起的空行,但没有效果
3) 我尝试将第二个模板更改为如下所示 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>
</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>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
额外的行是由于您将模板应用于根元素的所有 个子元素造成的。这包括 xsd:schema
节点。
您可以通过更改来防止这种情况:
<xsl:apply-templates/>
第 23 行到:
<xsl:apply-templates select="*[position() gt 1]"/>
P.S。我建议您使用 显式 名称来寻址源 XML 节点,而不是像 *[2]/*
这样的神秘缩写。这将使您的代码更具可读性,并因此更易于管理。
我对下面的 xsl 有以下疑问或问题。我已经包括了我当前的输出,xml 和 xsl。我在尝试删除包含双引号的第二行时遇到问题。我假设它来自模式节点。
1) 最接近的版本我的 xsl 在标题和数据之间放置了一个无效行,如下例所示。
2) 我尝试在第二个模板之前插入此模板“”以删除由模式节点引起的空行,但没有效果
3) 我尝试将第二个模板更改为如下所示 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>
</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>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
额外的行是由于您将模板应用于根元素的所有 个子元素造成的。这包括 xsd:schema
节点。
您可以通过更改来防止这种情况:
<xsl:apply-templates/>
第 23 行到:
<xsl:apply-templates select="*[position() gt 1]"/>
P.S。我建议您使用 显式 名称来寻址源 XML 节点,而不是像 *[2]/*
这样的神秘缩写。这将使您的代码更具可读性,并因此更易于管理。