XSL在根节点之后不能用于我的XML

时间:2016-05-18 23:27:05

标签: xml xslt xml-parsing transformation

我有一个XML文件,结构如下。我想从XML文件中读取数据并使用XSL文件将其转换为另一种格式,但在某些方面它甚至不能通过我的xml节点读取。有人可以建议我这样做。

XML文档:

 <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="spss2eml.xsl"?>
<outputTree xmlns="http://www.ibm.com/software/analytics/spss/xml/oms"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.ibm.com/software/analytics/spss/xml/oms http://www.ibm.com/software/analytics/spss/xml/oms/spss-output-1.8.xsd">
    <command command="Codebook" displayOutlineValues="label" displayOutlineVariables="label"
        displayTableValues="label" displayTableVariables="label" lang="en" text="Codebook">
        <pivotTable subType="Variable Information" text="Respondent_Serial">
            <dimension axis="row" text="Attributes">
                <group text="Standard Attributes">
                    <category text="Label">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Serial number"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Type">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Numeric"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Format">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="F10"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Measurement">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Scale"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Role">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Input"/>
                            </category>
                        </dimension>
                    </category>
                </group>
            </dimension>
        </pivotTable>
        <pivotTable subType="Variable Information" text="Respondent_ID">
            <dimension axis="row" text="Attributes">
                <group text="Standard Attributes">
                    <category text="Label">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="ID"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Type">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="String"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Format">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="A150"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Measurement">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Nominal"/>
                            </category>
                        </dimension>
                    </category>
                    <category text="Role">
                        <dimension axis="column" text="Values">
                            <category text="Value">
                                <cell text="Input"/>
                            </category>
                        </dimension>
                    </category>
                </group>
            </dimension>
        </pivotTable>
     </command>
   </outputTree>

我的XSL样式表(spss2eml.xsl):

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <attributeList>
            <xsl:for-each select="ns1:outputTree/ns1:command/ns1:pivotTable"
                xmlns:ns1="http://xml.spss.com/spss/oms">
                <xsl:element name="attribute">
                    <xsl:attribute name="id">
                        <xsl:value-of select="@text"/>
                    </xsl:attribute>
                    <xsl:element name="attributeName">
                        <xsl:value-of select="@text"/>
                    </xsl:element>
                    <xsl:element name="attributeDefinition">
                        <xsl:value-of
                            select="ns1:dimension/ns1:group[@text='Standard Attributes']/ns1:category[@text='Label']/ns1:dimension/ns1:category/ns1:cell/@text"
                        />
                    </xsl:element>
                    <xsl:element name="storageType">
                        <xsl:attribute name="typeSystem"
                            >http://www.w3.org/2001/XMLSchema-datatypes</xsl:attribute>
                        <xsl:choose>
                            <xsl:when
                                test="ns1:dimension/ns1:group[@text='Standard Attributes']/ns1:category[@text='Type']/ns1:dimension/ns1:category/ns1:cell[@text='Numeric']"
                                >float</xsl:when>
                            <xsl:otherwise>string</xsl:otherwise>
                        </xsl:choose>
                    </xsl:element>
                    <xsl:element name="measurementScale">
                        <xsl:choose>
                            <xsl:when
                                test="ns1:dimension/ns1:group[@text='Standard Attributes']/ns1:category[@text='Measurement']/ns1:dimension/ns1:category/ns1:cell[@text='Scale']">Scale                              
                            </xsl:when>
                            <xsl:when
                                test="ns1:dimension/ns1:group[@text='Standard Attributes']/ns1:category[@text='Measurement']/ns1:dimension/ns1:category/ns1:cell[@text='Nominal']">
                                <nominal>
                                    Nominal
                                </nominal>
                            </xsl:when>
                            <xsl:when
                                test="ns1:dimension/ns1:group[@text='Standard Attributes']/ns1:category[@text='Measurement']/ns1:dimension/ns1:category/ns1:cell[@text='Ordinal']">
                                <ordinal>
                                    Ordinal
                                </ordinal>
                            </xsl:when>
                        </xsl:choose>
                    </xsl:element>
                </xsl:element>
            </xsl:for-each>
        </attributeList>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您的源XML使用的命名空间与您在样式表中使用的命名空间不同。源XML的默认名称空间为:

xmlns="http://www.ibm.com/software/analytics/spss/xml/oms" 

但你定义:

xmlns:ns1="http://xml.spss.com/spss/oms"

而不是:

xmlns:ns1="http://www.ibm.com/software/analytics/spss/xml/oms"

进行此更改,您会看到不同之处。您尚未发布预期结果,因此我还没有进入您的实际代码。但请注意,您可以使用literal result elementsattribute value templates显着缩短它 - 例如:

<xsl:element name="attribute">
    <xsl:attribute name="id">
        <xsl:value-of select="@text"/>
    </xsl:attribute>
</xsl:element>

可以简单地写成:

<attribute id="{@text}"/>