2017-09-26 3 views
2

utilisant xslt-3,ajouter un élément à un nœud, si elle doesnot existe

je tente d'insérer la propriété élément, si elle n'existe pas à chaque noeud RECORD:

<?xml ="1.0" encoding="UTF-8"?> 
    <TABLE NAME="TABLE.DB"> 
     <DATA RECORDS="2"> 
      <RECORD ID="1"> 
       <RECNO>1</RECNO> 
       <SEQ>0</SEQ> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10355</ORDER> 
       <CN>PL</CN> 
      </RECORD> 
      <RECORD ID="2"> 
       <RECNO>2</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10356</ORDER> 
       <CN>PL 300 L</CN> 
      </RECORD> 
      <RECORD ID="3"> 
       <RECNO>3</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <NUMBER>10357</NUMBER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>0</PROPERTY> 
      </RECORD> 
     </DATA> 
    </TABLE> 

souhaitee résultat:

<?xml ="1.0" encoding="UTF-8"?> 
    <TABLE NAME="TABLE.DB"> 
     <DATA RECORDS="2"> 
      <RECORD ID="1"> 
       <RECNO>1</RECNO> 
       <SEQ>0</SEQ> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10355</ORDER> 
       <CN>PL</CN> 
       <PROPERTY>06</PROPERTY> 
      </RECORD> 
      <RECORD ID="2"> 
       <RECNO>2</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <ORDER>10356</ORDER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>06</PROPERTY> 
      </RECORD> 
      <RECORD ID="3"> 
       <RECNO>3</RECNO> 
       <SEQUENCE>0</SEQUENCE> 
       <DATE>17/12/1999 2:44:08 μμ</DATE> 
       <ID>12/11/2015 3:15:25 μμ</ID> 
       <NUMBER>10357</NUMBER> 
       <CN>PL 300 L</CN> 
       <PROPERTY>0</PROPERTY> 
      </RECORD> 
     </DATA> 
    </TABLE> 

ce que j'ai essayé, ajoute la propriété de l'élément, même si elle est déjà là, donc je me retrouve avec deux éléments de propriété, dans le même nœud, si elle existe déjà. Pourriez-vous me donner un exemple d'implémentation, j'utilise SAXON dernière version (9,8)

EDIT: ci-dessous xsl ajoute un élément, même quand il existe:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="xsl exsl xs"> 
    <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//*[local-name() = 'RECORD ID']"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
      <xsl:choose> 
       <xsl:when test="not(PRODUCT)"> 
        <PRODUCT><xsl:value-of select="98"/></PRODUCT> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:copy><xsl:value-of select="98"/></xsl:copy> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Cela paraît simple, même dans XSLT 1.0, écrire un template 'xsl: template match = "RECORD [pas (propriété)]/* [dernier()]"' où vous copiez cet élément et ajoutez le nouveau 'PROPERTY'. –

+0

apprendre XSLT-3, c'est pourquoi j'ai demandé, pour une implémentation XSLT-3, merci – Kedly

+0

La façon d'ajouter un noeud n'est pas différente dans XSLT 1 ou 2 ou 3, dans XSLT 3 vous avez un point de départ plus facile avec ' 'au lieu d'épeler une transformation d'identité. Essayez-le, puis expliquez-nous exactement où vous êtes coincé si vous ne le faites pas fonctionner. –

Répondre

1

La transformation d'identité peut être écrit en utilisant xsl:mode et il vous suffit d'ajouter un modèle correspondant RECORD[not(PROPERTY)]/*[last()] (le dernier élément enfant de RECORD s sans PROPERTY) qui copie que dernier enfant et ajoute une nouvelle PROPERTY:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:param name="new-prop" as="element(PROPERTY)"><PROPERTY>98</PROPERTY></xsl:param> 

    <xsl:template match="RECORD[not(PROPERTY)]/*[last()]"> 
     <xsl:copy-of select="., $new-prop"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

ci-dessus a travaillé comme un charme, seulement un avis mineur, il ajoute dans la même ligne avec l'élément précédent le – Kedly

+0

Ajout de '' devrait vous donner l'indentation , pourrait aider à faire cela avec '' pour le résultat le plus cohérent. –

+0

Merci beaucoup, ajouté à la fois, le résultat est idéal. – Kedly

0

Une autre approche est

<xsl:param name="new-prop" as="element(PROPERTY)"> 
    <PROPERTY>98</PROPERTY> 
</xsl:param> 

<xsl:template match="RECORD"> 
    <RECORD ID="{@ID}"> 
    <xsl:copy-of select="* except PROPERTY, (PROPERTY, $new-prop)[1]"/> 
    </RECORD> 
</xsl:template>