我正在尝试一些非常简单的东西,但由于某些原因它不起作用.基本上,我需要重命名XML文档中的一些节点.因此,我创建了一个XSLT文件来进行转换.
以下是XML的示例:
编辑:地址和地址元素出现在许多级别.这就是我必须尝试应用XSLT的原因.Visual Studio类型化数据集功能(从XSD文件创建类型化数据集)不允许您对同一个表具有嵌套引用.因此,拥有企业/业务/地址和企业/业务/联系人/地址会导致Load()失败.这是一个已知的问题,他们告诉你的只是"没有嵌套的表引用...编辑你的XSD以阻止它." 不幸的是,这意味着我们必须应用XSLT使XML符合"被黑"的XSD,因为这些文件来自第三方供应商.
所以,我们非常接近这里提供的帮助.最后几件事是这些:
1.)如何在xsl:template的match属性中使用命名空间引用,以指定我要将Businessinesses/Business/Addresses重命名为BusinessAddresses,但是将Businessities/Business/Contacts/Contact/Addresses重命名为ContactAddresses?
2.)如何通过显式命名空间引用阻止XSLT混乱每个新元素?它导致输出极度膨胀.
我创建了一个名为"steel"的命名空间,并且取得了很好的成功:
<xsl:template match="steel:Addresses>
<xsl:element name="BusinessAddresses>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是它将所有地址元素重命名为BusinessAddresses,即使我想要其中一些名为ContactAddresses,依此类推.不必要地向所有重命名的节点添加显式命名空间引用也很麻烦.
我尝试了这种方法,但是只要我在match属性中添加斜杠,它就是XSLT中的语法错误,如下所示:
<xsl:template match="steel:/Businesses/Business/Addresses">
Run Code Online (Sandbox Code Playgroud)
我觉得非常接近,但需要一些关于如何混合命名空间用法和使用斜杠来选择特定路径下的任何节点的方法的指导.
<?xml version="1.0"?>
<Businesses>
<Business>
<BusinessName>Steel Stretching</BusinessName>
<Addresses>
<Address>
<City>Pittsburgh</City>
</Address>
<Address>
<City>Philadelphia</City>
</Address>
</Addresses>
<Contacts>
<Contact>
<FirstName>Paul</FirstName>
<LastName>Jones</LastName>
<Addresses>
<Address>
<City>Pittsburgh</City>
</Address>
</Addresses>
</Contact>
</Contacts>
</Business>
<Business>
<BusinessName>Iron Works</BusinessName>
<Addresses>
<Address>
<City>Harrisburg</City>
</Address>
<Address>
<City>Lancaster</City>
</Address>
</Addresses>
</Business>
</Businesses>
Run Code Online (Sandbox Code Playgroud)
我需要将地址重命名为BusinessAddresses,我需要将地址重命名为BusinessAddress,直接在Business节点下为地址和地址的每个实例重命名.我还需要将地址重命名为ContactAddresses,我需要将地址重命名为ContactAddress,直接在联系节点下为地址和地址的每个实例重命名.
我尝试了几种解决方案,但似乎都没有.它们最终都会生成与原始文件相同的XML.
这是我尝试过的一个例子:
<xsl:template match="/">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template …Run Code Online (Sandbox Code Playgroud)