使用XSLT转换xml,以便定期节点获得唯一名称

时间:2017-11-06 10:51:19

标签: xml xslt transformation

很少添加,这个例子是更大的xml的一部分,希望我澄清它。

我有一个xml文件的以下部分:

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem">
<Zaak>
<ZaakNummer>21773</ZaakNummer>
<ZaakID>21768</ZaakID>
<Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel>
<Kenmerken>
<Kenmerk>
<KenmerkType>Starttijd evemenent</KenmerkType>
<Omschrijving>Starttijdevemenent</Omschrijving>
<Waarde>15:00</Waarde>
</Kenmerk>
<Kenmerk>
<KenmerkType>evement namens</KenmerkType>
<Omschrijving>evement namens</Omschrijving>
<Waarde>De Kompanjie</Waarde>
</Kenmerk>
<Kenmerk>
<KenmerkType>Datum evenement</KenmerkType>
<Omschrijving>Datumevenement</Omschrijving>
<Waarde>20171101</Waarde>
</Kenmerk>
</Kenmerken>
</Zaak>
</smartdocuments_root_node>

我想得到的是:

    <smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem">
<Zaak>
<ZaakNummer>21773</ZaakNummer>
<ZaakID>21768</ZaakID>
<Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel>
<Kenmerken>
<Kenmerk1>
<KenmerkType>Starttijd evemenent</KenmerkType>
<Omschrijving>Starttijdevemenent</Omschrijving>
<Waarde>15:00</Waarde>
</Kenmerk1>
<Kenmerk2>
<KenmerkType>evement namens</KenmerkType>
<Omschrijving>evement namens</Omschrijving>
<Waarde>De Kompanjie</Waarde>
</Kenmerk2>
<Kenmerk3>
<KenmerkType>Datum evenement</KenmerkType>
<Omschrijving>Datumevenement</Omschrijving>
<Waarde>20171101</Waarde>
</Kenmerk3>
</Kenmerken>
</Zaak>
</smartdocuments_root_node>

或者使用<KenmerkType>中的值重命名Kenmerk节点。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您可以从identity template开始,按原样复制输入数据。

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
</xsl:template>

<Kenmerk>元素需要修改为<Kenmerk1><Kenmerk2>,依此类推。 请注意,不应该是节点名称中的空格 ,因此无法追加<KenmarkType>的值。为了重命名节点,您可以使用节点名称创建变量,并将节点的位置附加到该变量。

<xsl:variable name="newNodeName" select="concat(local-name(), position())" />

修改 修改后的输入XML现在具有带名称空间的根元素。

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem">

这表示所有元素都属于此命名空间,并且必须在XSLT中访问时使用命名空间的别名来标识。此处使用了别名abc作为示例。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:abc="http://com.logica.digimeente.zaaksysteem" >

然后使用别名访问元素。

<xsl:template match="abc:Kenmerk">

以下是完整的XSLT。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:abc="http://com.logica.digimeente.zaaksysteem" >
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="abc:Kenmerk">
        <xsl:variable name="newNodeName" select="concat(local-name(), position())" />
        <xsl:element name="{$newNodeName}">
            <xsl:apply-templates />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem">
    <Zaak>
        <ZaakNummer>21773</ZaakNummer>
        <ZaakID>21768</ZaakID>
        <Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel>
        <Kenmerken>
            <Kenmerk1>
                <KenmerkType>Starttijd evemenent</KenmerkType>
                <Omschrijving>Starttijdevemenent</Omschrijving>
                <Waarde>15:00</Waarde>
            </Kenmerk1>
            <Kenmerk2>
                <KenmerkType>evement namens</KenmerkType>
                <Omschrijving>evement namens</Omschrijving>
                <Waarde>De Kompanjie</Waarde>
            </Kenmerk2>
            <Kenmerk3>
                <KenmerkType>Datum evenement</KenmerkType>
                <Omschrijving>Datumevenement</Omschrijving>
                <Waarde>20171101</Waarde>
            </Kenmerk3>
        </Kenmerken>
    </Zaak>
</smartdocuments_root_node>