我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。
输入消息:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/">
<header>
<identity/>
<message-id>56b3b200-1945-44a9-9dcf-a90de1f99060</message-id>
<correlation-id>56b3b200-1945-44a9-9dcf-a90de1f99060</correlation-id>
<message-date-time>2016-11-14T11:31:49</message-date-time>
<esb-environment>DEV</esb-environment>
</header>
<errors/>
<body>
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0">
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
</urn:submitOrder>
</body>
</ns2:esbMessage>
预期输出消息:
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0">
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
</urn:submitOrder>
实际输出消息:
<submitOrder>
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
</submitOrder>
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="utf-8"
omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:for-each select="//body">
<xsl:apply-templates select="@* | node()" />
</xsl:for-each>
</xsl:template>
<!-- template to copy elements -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<!-- template to copy attributes -->
<xsl:template match="@*">
<xsl:attribute name="{local-name()}" >
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<!-- template to copy the rest of the nodes -->
<xsl:template match="comment() | text() | processing-instruction()">
<xsl:copy />
</xsl:template>
</xsl:stylesheet>
实现所需结果的简单方法是:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:urn="urn:switchyard-quickstart:bean-service:1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select="body/urn:submitOrder"/>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0" xmlns:ns2="http://messagev2.esb.company.com/">
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
</urn:submitOrder>
包含冗余的ns2“http://messagev2.esb.company.com/“命名空间声明,您不必担心。如果删除它很重要(尽管我不知道为什么),您可以执行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0">
<xsl:apply-templates select="body/urn:submitOrder/order"/>
</urn:submitOrder>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
一、 更改的XML
<ns2:esbMessage xmlns:ns2="http://messagev2.esb.company.com/">
<header>
<identity/>
<message-id>56b3b200-1945-44a9-9dcf-a90de1f99060</message-id>
<correlation-id>56b3b200-1945-44a9-9dcf-a90de1f99060</correlation-id>
<message-date-time>2016-11-14T11:31:49</message-date-time>
<esb-environment>DEV</esb-environment>
</header>
<errors/>
<body>
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0">
<!-- first -->
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
<?world?>
</urn:submitOrder>
</body>
</ns2:esbMessage>
二、建议的XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns2="http://messagev2.esb.company.com/"
xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"
exclude-result-prefixes="ns2">
<xsl:output method="xml" indent="no" omit-xml-declaration="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="/ns2:esbMessage/body/urn:submitOrder"/>
</xsl:template>
</xsl:stylesheet>
三、 结果
<urn:submitOrder xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"
xmlns:ns2="http://messagev2.esb.company.com/">
<!-- first -->
<order>
<orderId>100001</orderId>
<itemId>5001</itemId>
<quantity>5</quantity>
</order>
<?world?>
</urn:submitOrder>
对您的xslt的反馈:
您正在删除节点的名称空间,我认为您不了解到目前为止您做了什么local-name()
仅返回节点的名称。在xslt中,您将使用源节点的本地名称创建一个新节点。
编辑1:
从结果中删除ns2
恕我直言,我不知道为什么上面的xslt会复制未使用的名称空间来输出xml。一种解决方案是:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:urn="urn:switchyard-quickstart:bean-service:1.0"
xmlns:ns2="http://messagev2.esb.company.com/">
<xsl:output method="xml" indent="no" omit-xml-declaration="yes" />
<xsl:template match="node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="/ns2:esbMessage/body/urn:submitOrder"/>
</xsl:template>
</xsl:stylesheet>
我有这个xml是架构版本3.0http://www.test.com/Service/v3。我需要将其降级到版本1http://www.test.com/Service/v1.为此,我使用XSL来转换它。 但我得到这样的结果 在我的输出XML中,我得到了这个 为什么将其添加到NS2:消息中? 它不在输入xml中。 我遗漏了一些东西。如果有人能指出这个问题,我将不胜感激。 我希望在输出中创建以下内容
我试图用XSLT处理器在PHP中转换xml文档,但我无法选择任何内容。。。我认为这是一个名称空间问题。如果我从一个干净的<代码> inputxml: Xsl-file: 我无法更改输入文件,因为它是由其他程序生成的。 安德烈
我是XSLT的新手,命名空间有问题。这是我必须转换的XML: 我正在使用以下XSLT: 结果是: 我试图删除结果输入顺序中的名称空间,但它不适合我。有人能帮我学习XSLT吗?谢谢
我试图将Excel xml文件的一部分呈现为超文本标记语言,以便在翻译(外语翻译)计算机辅助翻译工具中的部分内容时改进预览。 我有以下xml: 我试图从每行中提取第二个数据元素并显示它,但我根本无法显示它。我认为这与名称空间有关,我肯定遗漏了什么,但看不出是什么。这就是我正在使用的: 有人能帮我吗? 我应该补充一点,我正在使用Treebeard来测试这个,它用这些错误验证xml(我无法控制)...
如果我删除所有命名空间和前缀,我的XSLT转换将完美运行。 我曾尝试过几次引入名称空间,但最终总是出现某种错误或没有输出,因此我在这里寻求一些帮助和理解。 我的预期输出,缩减为命名空间和前缀,是: 再次缩减的XML输入是: 为了实现正确的命名空间转换,我需要向XSLT头中添加什么?
抱歉,如果我问的是新手问题,但名称空间对我来说真的很费解。 我试图从一个XML/XSLT生成多个SVG文档。 我的样式表: 这样做会产生以下输出: 但我希望能够根据计算的内容指定高度和宽度属性 我尝试将“ ”创建为 http://www.w3.org/2000/svg 这将失败,因为它(xmlspy)不允许我分配xmlns属性。 如果不在根(svg)上指定名称空间,则xmlns将自动添加到根 节点