【发布时间】:2016-06-26 00:42:06
【问题描述】:
我的源xml是:
<?xml version="1.0" encoding="UTF-8"?>
<PMML version="4.1" xmlns="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-4_1 pmml-4-1.xsd">
<Header copyright="(C) Copyright IBM Corp. 1989, 2014.">
<Application name="IBM SPSS Statistics 23.0" version="23.0.0.0"/>
</Header>
<GeneralRegressionModel algorithmName="multinomialLogistic" functionName="classification" modelType="multinomialLogistic" targetVariableName="CLASS">
<MiningSchema>
<MiningField missingValueTreatment="asIs" name="CLASS" usageType="predicted"/>
<MiningField missingValueTreatment="asIs" name="ACTIVE_CUSTOMER" usageType="active"/>
<MiningField missingValueTreatment="asIs" name="SEGMENT" usageType="active"/>
</MiningSchema>
<ParameterList>
<Parameter label="Konstanter Term" name="P0000001"/>
<Parameter label="[ACTIVE_CUSTOMER=0]" name="P0000002"/>
<Parameter label="[ACTIVE_CUSTOMER=1]" name="P0000003"/>
<Parameter label="[SEGMENT=0]" name="P00000004"/>
<Parameter label="[SEGMENT=1]" name="P00000005"/>
</ParameterList>
<ParamMatrix>
<PCell beta="-167.307903919999" df="1" parameterName="P0000001" targetCategory="1"/>
<PCell beta="-0.0747629275586869" df="1" parameterName="P0000002" targetCategory="1"/>
<PCell beta="0.409965797830495" df="1" parameterName="P0000003" targetCategory="1"/>
<PCell beta="-1.03190717557433" df="1" parameterName="P0000004" targetCategory="1"/>
<PCell beta="0.904157514089376" df="1" parameterName="P0000005" targetCategory="1"/>
</ParamMatrix>
</GeneralRegressionModel>
</PMML>
我的输出 xml 是:
<?xml version="1.0" encoding="utf-8"?>
<Predictors xmlns:ns="some:ns" xmlns:rs="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Predictor coefficient="-167.307903919999" name="__INTERCEPT__" value=""/>
<Predictor coefficient="-0.0747629275586869" name="ACTIVE_CUSTOMER" value="0"/>
<Predictor coefficient="0.409965797830495" name="ACTIVE_CUSTOMER" value="1"/>
<Predictor coefficient="" name="SEGMENT" value="0"/>
<Predictor coefficient="" name="SEGMENT" value="1"/>
</Predictors>
我可以通过以下 xslt 实现这一点:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" xmlns:ns="some:ns" xmlns:rs="http://www.dmg.org/PMML-4_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<xsl:output encoding="utf-8" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:key match="rs:ParamMatrix/rs:PCell" name="cell" use="@parameterName"/>
<xsl:key match="rs:DataDictionary/rs:DataField" name="dataField" use="@name"/>
<!-- identity transform -->
<xsl:template match="node()|@*">
<xsl:apply-templates select="node()|@*"/>
</xsl:template>
<xsl:template match="rs:GeneralRegressionModel">
<!--MiningSchema-->
<xsl:apply-templates select="rs:MiningSchema"/>
<!--RegressionTable for predicted targetVariable targetCategory-->
<Predictors>
<xsl:apply-templates select="rs:ParameterList/rs:Parameter"/>
</Predictors>
</xsl:template>
<xsl:template match="rs:Parameter[not(contains(@label, '='))][@name='P0000001']">
<Predictor coefficient="{key('cell', @name)/@beta}" name="__INTERCEPT__" value=""/>
</xsl:template>
<xsl:template match="rs:Parameter[not(contains(@label, '='))][@name!='P0000001']">
<Predictor coefficient="{key('cell', @name)/@beta}" name="{@label}" value=""/>
</xsl:template>
<xsl:template match="rs:Parameter[contains(@label, '=')]" name="split">
<Predictor coefficient="{key('cell', @name)/@beta}" name="{substring-after(substring-before(@label,'='),'[')}" value="{substring-before(substring-after(@label,'='),']')}"/>
</xsl:template>
</xsl:transform>
此 XSLT 有效。 但是,我有两个问题: 1. 源xml开头,有命名空间,如'xmlns="http://www.dmg.org/PMML-4_1"',可以是其他值。整个文档仅使用这一个命名空间。目前在我的 xslt 中,我将命名空间设置为固定值 'xmlns:rs="http://www.dmg.org/PMML-4_1" ',这是不正确的。如何在 xslt 中动态设置命名空间?
- 在 xslt 中设置命名空间后,它也会显示在输出 xml 中。如何从输出 xml 中删除此命名空间?
如果可以的话,能否请您直接修改我的 xslt 以显示用法?
非常感谢!!!
【问题讨论】:
-
"在源xml的开头,有命名空间,比如'xmlns="dmg.org/PMML-4_1"',可以是其他值。"你能解释一下如何真的有效吗?命名空间是 XML 模式的一部分——它不应该随意改变。你至少有一个可能的命名空间“银行”吗? -- 关于你的第二个问题:使用
exclude-result-prefixes="rs"。并删除 identity transform 模板:您不会从源 XML 复制任何内容,也不想从源 XML 复制任何内容 - 否则您也会复制其命名空间。 -
请注意,您的评论标识为
identity transform的模板不是身份转换,因为它不使用xsl:copy,而仅使用<xsl:apply-templates select="node()|@*"/>。至于命名空间是动态的问题,对于 XSLT 2.0 处理器,您可以使用*:foo,例如<xsl:template match="*:GeneralRegressionModel"><xsl:apply-templates select="*:MiningSchema"/>...,但它同意这个对任意命名空间的要求听起来很奇怪。 -
@michael.hor257k 我正在处理由统计软件生成的 XML。如果 XML 是由使用旧版本软件的人发送给我的,命名空间可能是 'xmlns="dmg.org/PMML-4_0"',如果使用新版本的软件,则名称空间可能是 'xmlns= “dmg.org/PMML-4_1”。对我的要求是,无论是哪个版本的软件,xslt 都应该可以工作。
-
@michael.hor257k 我简化了源 xml 和目标 xml,以使这里的问题更容易发布。我确实需要身份转换来复制源 xml 的某些部分。
-
@michael.hor257k @Martin Honnen 我不想忽略命名空间。我仍然使用 XSLT 1.0。我在我的程序中使用这个 xslt。如果我可以解析源 xml 文件以获取命名空间,我可以将此命名空间用作 xslt 中的输入参数吗?如果是,你认为这是一种可行的方法吗?你介意告诉我怎么做吗? ---- 非常感谢
标签: xml xslt namespaces