2017-11-06 3 views
2

少し追加して、この例は大きなxmlの一部です。XSLTを使用して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ノードの名前を変更します。

誰でも手伝ってもらえますか?

+0

あなたはこれをしたいかなりか?そのようなXMLは、(たとえそれがうまく構成されていても)作業する悪魔です。誰もそのような形式にしてくれてありがとうと思います。 –

答えて

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())" /> 

EDIT 修正された入力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> 
+0

ありがとう、私は少しの情報を追加し、これが動作するように本当に苦労しています。あなたが助けることができれば本当に感謝します。 –

+0

更新された入力XMLには、要素を識別するためにXSLTによって処理される必要がある名前空間が含まれるようになりました。更新された答えと名前空間の扱いについての説明をご覧ください。 –

関連する問題