【问题标题】:How to showing namespaces inside xml with xsl?如何使用 xsl 在 xml 中显示名称空间?
【发布时间】:2013-06-18 15:08:02
【问题描述】:

这是我新的(编辑过的)更完整的场景: 我有一个 xml,它将用 xsl 进行转换。我从客户那里得到了一个例子,看起来像: 在文件中的 XML:

<?xml version="1.0" encoding="utf-8"?>
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany">
    <tns:sentFr>123456</tns:sentFr>
  </tns:myCompanyHeader>
  <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany">
    <tns:myCompanyUser ssn="1234567890">
      <tns:firstName>John</tns:firstName>
    </tns:myCompanyUser>
  </tns:myCompanyUsers>
</xsi:myCompanyImport>

XSL 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:tns="http://www.MyComp.se/myCompany"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.MyComp.se/myCompany myCompanyUsers.xsd"
                                xmlns:local="urn:cs">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:element name="xsi:myCompanyImport" namespace="http://www.w3.org/2001/XMLSchema-instance">
            <!--Start Header-->
            <xsl:element name="tns:myCompanyHeader" >
                <xsl:element name="tns:sentFr" >
                    <xsl:value-of select="_x0023_MyComp_header/@SentFrom" />
                </xsl:element>
            </xsl:element>
            <!--End Header-->

            <!--Start Users-->
            <xsl:element name="tns:myCompanyUsers">
                <!--Loop through persons-->
                <xsl:for-each select="_x0023_MyComp_header/_x0023_MyComp_Employee">
                    <xsl:element name="tns:myCompanyUser" >
                        <xsl:attribute name="ssn">
                            <xsl:value-of select="@inSsn" />
                        </xsl:attribute>
                        <xsl:element name="tns:firstName" >
                            <xsl:value-of select="@inFname"/>
                        </xsl:element>
                    </xsl:element>
                </xsl:for-each>
                <!--End Loop-->
            </xsl:element>
            <!--End Users-->

        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

(不要介意 xsl 中的 Csharp 代码,它用于此处未显示的目的。) 所以,现在的结果是:

<?xml version="1.0" encoding="utf-8"?>
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany">
    <tns:sentFr>123456</tns:sentFr>
  </tns:myCompanyHeader>
  <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany">
    <tns:myCompanyUser ssn="1234567890">
      <tns:firstName>John</tns:firstName>
    </tns:myCompanyUser>
  </tns:myCompanyUsers>
</xsi:myCompanyImport>

但客户想要:

<?xml version="1.0" encoding="utf-8"?>
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany">
    <tns:sentFr>123456</tns:sentFr>
  </tns:myCompanyHeader>
  <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd">
    <tns:myCompanyUser ssn="1234567890">
      <tns:firstName>John</tns:firstName>
    </tns:myCompanyUser>
  </tns:myCompanyUsers>
</xsi:myCompanyImport>

如何在 xsl 中编写它以便显示在 xml 中?我尝试了许多不同的方法,但没有成功。实际上只是我要添加到 tns:myCompanyUsers 的那 2 行:

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd">

我想进去。但没有成功!

【问题讨论】:

  • 您确定用户数据在 xsi 命名空间中吗?这太奇怪了。但是很难为您提供更多帮助,我看不出您希望转换的输出是什么。
  • 嗯。嗯,他们已经多次改变了他们的要求,每次我们与他们交谈时,我都会得到新的信息。一会儿我会放一个更完整的场景。

标签: xml xslt


【解决方案1】:

如何在 xsl 中编写它以便显示在 xml 中?

按字面意思写,而不是

<xsl:element name="myns:myCustomerUsers" >

使用

<myns:myCustomerUsers xmlns:tns="http://www.myCustomerWeb.se/myCustomer" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd">

或者简单地说

<myns:myCustomerUsers 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd">

因为文字结果元素继承了样式表中当时范围内的命名空间节点(在您的情况下,那些在&lt;xsl:stylesheet&gt; 上声明的节点)。您可能需要将exclude-result-prefixes="msxsl" 添加到您的&lt;xsl:stylesheet&gt; 元素,否则myns:myCustomerUsers 元素也将获得xmlns:msxsl="urn:schemas-microsoft-com:xslt" 声明。

只有当元素名称不是常量时才需要使用&lt;xsl:element&gt;

【讨论】:

  • @user2497316 同样的建议也适用 - 如果您有一个具有固定名称的特定元素要包含在输出中,那么只需将其作为文字元素放在样式表中,您不需要需要&lt;xsl:element&gt;,除非您想动态构建元素的名称。
  • 对不起,我没有正确阅读您的第一个答案。当然你是对的,我在标签中按原样写了它,而且中提琴!非常感谢。 J
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2015-08-05
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多