Я работаю над 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 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>
Я хочу удалить атрибут ComplementCodeRouteur в элементе Client. Кто-нибудь знает, как это сделать.
Необычный вопрос, я хотел бы упростить копию элемента Magasin. Теперь каждый атрибут копируется. Возможно ли создать атрибут "copy all", но CodeRouteur определяется вручную?
PS: Я удалил много атрибутов, чтобы улучшить читаемость. Может быть какой-то мертвый атрибут.
PS 2: я могу использовать реализацию .net в .Net(XSLT 1.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 создается в шаблоне match = "Клиент" (а не в шаблоне 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>
Когда у меня есть 2
Пример:
<?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>
даст:
<?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>
node()
на*
также будет копировать текст и комментировать детей, если они когда-нибудь придут.