我有一个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>
答案 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 elements和attribute value templates显着缩短它 - 例如:
<xsl:element name="attribute">
<xsl:attribute name="id">
<xsl:value-of select="@text"/>
</xsl:attribute>
</xsl:element>
可以简单地写成:
<attribute id="{@text}"/>