C# 删除Xslt中的属性
我正在研究XSLT 我有以下XML源文件:C# 删除Xslt中的属性,c#,.net,xml,xslt,xpath,C#,.net,Xml,Xslt,Xpath,我正在研究XSLT 我有以下XML源文件: <?xml version="1.0" encoding="UTF-8"?> <Magasins> <Magasin Nom="Name" CodeRouteur="TE"> <Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client> <Client IdClien
<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
<Magasin Nom="Name" CodeRouteur="TE">
<Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
<Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
</Magasin>
<Magasin Nom="Name2" CodeRouteur="TE">
<Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
</Magasins>
此XSL文件:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Magasins">
<Magasins xmlns:xi="http://www.w3.org/2001/XInclude" Id="{@Id}">
<xsl:apply-templates/>
</Magasins>
</xsl:template>
<xsl:key name="kClientGroup" match="Client"
use="concat(../@CodeRouteur, @ComplementCodeRouteur)"
/>
<xsl:template match="Magasin">
<xsl:apply-templates select="Client[generate-id()
=
generate-id(key('kClientGroup',
concat(../@CodeRouteur, @ComplementCodeRouteur))[1])]"
/>
</xsl:template>
<xsl:template match="Client">
<Magasin
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}"
Nom="{../@Nom}">
<xsl:apply-templates select="key('kClientGroup',
concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>
</Magasin>
</xsl:template>
<xsl:template match="Client" mode="copy">
<xsl:copy>
<xsl:copy-of select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我有一个结果:
<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
<Magasin Nom="Name" CodeRouteur="TEA">
<Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
<Magasin Nom="Name" CodeRouteur="TEA">
<Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
</Magasin>
<Magasin Nom="Name2" CodeRouteur="TEA">
<Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
</Magasins>
我想删除Client元素中的ComplementCodeRouteur属性。
有人知道怎么做吗
错误的问题,我想简化Magasin元素的副本。
现在,将复制每个属性。
是否可以创建“复制所有属性,但CodeRouteur是手动定义的”
PS:为了提高可读性,我删除了很多属性。可能有一些死的属性
PS 2:我只能在.net中使用.net实现(XSLT1.0)
编辑:
我有一个很好的解决方案,但我还有另一个需要
<xsl:template match="Client">
<Magasin
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}"
Nom="{../@Nom}">
<xsl:apply-templates select="key('kClientGroup',
concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>
</Magasin>
</xsl:template>
我想复制所有Magasin属性,但不复制将手动定义的CodeRouteur属性。您还可以注意到,Magasin元素是在template match=“Client”(而不是template match=“Magasin”)中创建的,因为CodeRouteur属性是使用Client元素中包含的信息定义的
编辑2:
我发现了另一只虫子
我目前的XSLT是:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Magasins">
<Magasins xmlns:xi="http://www.w3.org/2001/XInclude" Id="{@Id}">
<xsl:apply-templates/>
</Magasins>
</xsl:template>
<xsl:key name="kClientGroup" match="Client"
use="concat(../@CodeRouteur, @ComplementCodeRouteur)"
/>
<xsl:template match="Magasin">
<xsl:apply-templates select="Client[generate-id()
=
generate-id(key('kClientGroup',
concat(../@CodeRouteur, @ComplementCodeRouteur))[1])]"
/>
</xsl:template>
<xsl:template match="Client">
<Magasin
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}">
<xsl:copy-of select="../@*[name() != 'CodeRouteur']"/>
<xsl:apply-templates select="key('kClientGroup',
concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>
</Magasin>
</xsl:template>
<xsl:template match="Client" mode="copy">
<xsl:copy>
<xsl:copy-of select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当我有两个
例:
将提供:
<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
<Magasin Nom="Name" CodeRouteur="TEA">
<Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
<Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
<Magasin Nom="Name2" CodeRouteur="TEB">
<Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
</Magasin>
</Magasins>
我想:
<?xml version="1.0" encoding="UTF-8"?>
<Magasins>
<Magasin Nom="Name" CodeRouteur="TEA">
<Client IdClient="1" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
<Magasin Nom="Name" CodeRouteur="TEB">
<Client IdClient="2" ComplementCodeRouteur="B" Name="XXX"><Elem /></Client>
</Magasin>
<Magasin Nom="Name2" CodeRouteur="TEA">
<Client IdClient="3" ComplementCodeRouteur="A" Name="YYY"><Elem /></Client>
</Magasin>
</Magasins>
如何修改XSLT文件。
如果信息发生变化,我希望有一个Magasin元素:Magasin、CodeRouteur、ComplementCodeRouteur
<xsl:template match="Client" mode="copy">
<xsl:copy>
<xsl:copy-of select="node() | @*[not(name() = 'ComplementCodeRouteur')]"/>
</xsl:copy>
</xsl:template>
已更新:
<xsl:template match="Client">
<Magasin
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}"
>
<xsl:copy-of select="../@*[name() != 'CodeRouteur']"/>
<xsl:apply-templates select="key('kClientGroup',
concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>
</Magasin>
</xsl:template>
用*
替换节点()
也会复制文本和注释子项,如果他们进来的话。我还需要子项,所以这很完美。我还有第二个需要。我想复制所有Magasin元素,而不复制一个手动定义的元素。你有解决办法吗?@Philippe,你可以用同样的方法:Magasin[not(YourElement)]
非常感谢你,这是正确的。我更新了问题,我有最后一个错误。你能帮助我吗?
<xsl:template match="Client">
<Magasin
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CodeRouteur="{concat(../@CodeRouteur,@ComplementCodeRouteur)}"
>
<xsl:copy-of select="../@*[name() != 'CodeRouteur']"/>
<xsl:apply-templates select="key('kClientGroup',
concat(../@CodeRouteur,@ComplementCodeRouteur))" mode="copy"/>
</Magasin>
</xsl:template>