我在通过xslt 2.0将输入xml转换为oputput xml时遇到了问题。以下是输入xml
<Heard sequence_id="10363284">
<doctype>News</doctype>
<Banner>--Alert--</Banner>
<PCategory>WW</PCategory>
<Topic>XX,YY,ZZ</Topic>
<type>RealTime</type>
<headline>xxxxxxxxxxxxxxxxxx</headline>
<TextBody>xxxxxxxxx</TextBody>
<headline_datetime>2014-09-09T10:51:27-04:00</headline_datetime>
<service_line>ABC</service_line>
<page_num>123</page_num>
</Heard>
预期的输出应为
<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prism="http://prismstandard.org/namespaces/basic/2.0" xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:prl="http://prismstandard.org/namespaces/prl/2.0" xmlns:mgh="http://comp.com/prismPlus-XSD">
<mgh:article>
<mgh:head>
<dc:identifier>10363284</dc:identifier>
<dc:title>xxxxxxxxxxxxxxxxxx</dc:title>
<dc:publisher>Comp</dc:publisher>
<dc:subject>--Alert--</dc:subject>
<prism:publicationDate>09/08/2014</prism:publicationDate>
<prism:subsection1>News</prism:subsection1>
<prism:keyword>XX,YY,ZZ</prism:keyword>
<mgh:category>WW</mgh:category>
<mgh:serviceLine>ABC</mgh:serviceLine>
<mgh:pageNumber>123</mgh:pageNumber>
</mgh:head>
<mgh:contentFeatureBody>
<body>
xxxxxxxxxxxxxxxxxxxx
</body>
</mgh:newsFeatureBody>
</mgh:article>
</mgh:message>
在xslt 2.0中,如何添加多个名称空间,如 dc,prism,mgh ?如果您需要其他信息,请告诉我,因为我对SO很新,如果您能帮助我,我们将非常感谢。
答案 0 :(得分:2)
如果你正在创建mgh:message
作为文字结果元素,那么提供这些命名空间声明的范围应该在它应该工作的适当位置:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:prism="http://prismstandard.org/namespaces/basic/2.0"
xmlns:dc="http://purl.org/dc/elements/1.1"
xmlns:prl="http://prismstandard.org/namespaces/prl/2.0"
xmlns:mgh="http://comp.com/prismPlus-XSD">
<xsl:template match="/">
<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd">
<!-- etc -->
因为文字结果元素保留样式表中该点范围内的名称空间。
您当然可以将声明放在mgh:message
元素本身而不是xsl:stylesheet
上,但如果您在另一个模板中创建dc:*
元素,则可以#39; d也必须在那里重复xmlns:dc
。总的来说,我发现将所有声明放在根目录更容易,除非你有特殊的理由不这样做。
答案 1 :(得分:0)
将名称空间和别名投影到输出文档中并不是特别的秘密 - 与其他xml文档一样,在根元素中声明它们,然后使用别名。 AFAIK schemaLocation
需要手动映射到根元素作为属性。这是一个基本的骨架模板(请注意,我已经跳过了大部分元素)
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:prism="http://prismstandard.org/namespaces/basic/2.0"
xmlns:dc="http://purl.org/dc/elements/1.1"
xmlns:prl="http://prismstandard.org/namespaces/prl/2.0"
xmlns:mgh="http://comp.com/prismPlus-XSD">
<xsl:template match="/Heard">
<mgh:message> <!--OR of course <msh xmlns="...">-->
<xsl:attribute name="schemaLocation"
namespace="http://www.w3.org/2001/XMLSchema-instance"
>http://comp.com/prismPlus-XSD HeardsContent.xsd</xsl:attribute>
<mgh:article>
<mgh:head>
<dc:identifier>
<xsl:value-of select="some/path/to/value"></xsl:value-of>
</dc:identifier>
<prism:keyword>
<xsl:value-of select="Topic"></xsl:value-of>
</prism:keyword>
</mgh:head>
<mgh:contentFeatureBody>
<body> <!--Note, global namespace so no alias or xmlns-->
<xsl:value-of select="TextBody"></xsl:value-of>
</body>
</mgh:contentFeatureBody>
</mgh:article>
</mgh:message>
</xsl:template>
</xsl:stylesheet>
这会产生以下输出xml:
<?xml version="1.0" encoding="utf-8"?>
<mgh:message xsi:schemaLocation="http://comp.com/prismPlus-XSD HeardsContent.xsd"
xmlns:mgh="http://comp.com/prismPlus-XSD"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:prism="http://prismstandard.org/namespaces/basic/2.0"
xmlns:dc="http://purl.org/dc/elements/1.1"
xmlns:prl="http://prismstandard.org/namespaces/prl/2.0">
<mgh:article>
<mgh:head>
<dc:identifier></dc:identifier>
<prism:keyword>XX,YY,ZZ</prism:keyword>
</mgh:head>
<mgh:contentFeatureBody>
<body>xxxxxxxxx</body>
</mgh:contentFeatureBody>
</mgh:article>
</mgh:message>