2017-06-14 1 views
0
<?xml version="1.0" encoding="UTF-8"?> 
<TABLE NAME="less.db"> 
    <DATA RECORDS="233673"> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>ASUS</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>asus</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="14"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>Creative Labs</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>Creative</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="14"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>This is a test. Replace (all)</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
    </DATA> 
</TABLE> 

search.txt:recherche xml et remplacer les erreurs xsl

ASUS 
creative 
This is a test. Replace (all) 

replace.txt

GIGABYTE 
LOGITECH 
REPLACEMENT 

et xsl:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:functx="http://www.functx.com" 
    exclude-result-prefixes="xs functx" 
    version="2.0"> 

    <xsl:param name="search-file" as="xs:string" select="'search.txt'"/> 
    <xsl:param name="replacement-file" as="xs:string" select="'replace.txt'"/> 


    <xsl:param name="search-terms" as="xs:string*" select="tokenize(unparsed-text($search-file), '\r?\n')"/> 

    <xsl:param name="search-terms-is" as="xs:string*" select="for $term in $search-terms return lower-case(functx:escape-for-regex($term))"/> 

    <xsl:param name="replace-terms" as="xs:string*" select="tokenize(unparsed-text($replacement-file), '\r?\n')"/> 

    <xsl:include href="http://www.xsltfunctions.com/xsl/functx-1.0-nodoc-2007-01.xsl"/> 

    <xsl:function name="functx:replace-multi" as="xs:string?" 
     xmlns:functx="http://www.functx.com"> 
     <xsl:param name="arg" as="xs:string?"/> 
     <xsl:param name="changeFrom" as="xs:string*"/> 
     <xsl:param name="changeTo" as="xs:string*"/> 
     <xsl:param name="flags" as="xs:string"/> 

     <xsl:sequence select=" 
      if (count($changeFrom) > 0) 
      then functx:replace-multi(
      replace($arg, $changeFrom[1], 
      functx:if-absent($changeTo[1],''), $flags), 
      $changeFrom[position() > 1], 
      $changeTo[position() > 1]) 
      else $arg 
      "/> 

    </xsl:function> 

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

    <xsl:template match="MANUFACTURER[some $search-term in $search-terms-is satisfies matches(current(), $search-term, 'i')]"> 
     <xsl:copy> 
      <xsl:variable name="matched-terms" as="xs:string*" select="$search-terms-is[matches(current(), ., 'i')]"/> 
      <xsl:variable name="replacements" as="xs:string*" select="for $t in $matched-terms return $replace-terms[position() = index-of($search-terms-is, $t)]"/> 
      <xsl:value-of 
       select="functx:replace-multi(., $matched-terms, $replacements, 'i')"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

donne en sortie, ce qui suit :

<?xml version="1.0" encoding="UTF-8"?> 
<TABLE NAME="less.db"> 
    <DATA RECORDS="233673"> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>GIGABYTE</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>GIGABYTE</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="14"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>LOGITECH Labs</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="1"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>LOGITECH</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
     <RECORD ID="14"> 
     <ID>1</ID> 
     <ROW>0</ROW> 
     <DATE>19/9/2003 12:31:54 μμ</DATE> 
     <al>29/6/2005 10:46:42 πμ</al> 
     <KIT>46123</KIT> 
     <KAP>08</KAP> 
     <YTE>A.IV.C.54</YTE> 
     <HTE>0</HTE> 
     <HEN>0</HEN> 
     <SUM>0</SUM> 
     <LYW>0</LYW> 
     <AMF>29</AMF> 
     <MANUFACTURER>REPLACEMENT</MANUFACTURER> 
     <AME>pan</AME> 
     </RECORD> 
    </DATA> 
</TABLE> 

Comment devrait être fait le xsl utilisé, de manière à avoir une recherche et un remplacement exacts? par exemple, LOGITECH Labs est un remplacement indésirable. Nous voulions remplacer uniquement chaque élément qui a exactement le mot créatif (remplacement insensible à la casse), et non ce mot, où qu'il se trouve dans l'élément MANUFACTURER

+1

N'attendez pas de nous pour télécharger et ouvrir les fichiers zip, essayez d'identifier les données qui causent le problème, puis montrer l'échantillon correspondant extrait dans votre question. Je soupçonne que vous avez des éléments contenant plusieurs termes de recherche, vous devrez expliquer ce que vous voulez faire dans ce cas, si vous aurez besoin de tous les remplacer. –

+0

je n'étais pas capable d'identifier les données qui causent le problème ... la réponse est oui, les remplacer tous, s'il y a des éléments contenant plusieurs termes de recherche –

Répondre

0

Je pense que l'erreur peut provenir d'éléments contenant plus d'un terme de recherche, voici un exemple de code adapté qui, heureusement, ne donne pas cette erreur:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:functx="http://www.functx.com" 
    exclude-result-prefixes="xs functx" 
    version="2.0"> 

    <xsl:param name="search-file" as="xs:string" select="'search.txt'"/> 
    <xsl:param name="replacement-file" as="xs:string" select="'replace.txt'"/> 


    <xsl:param name="search-terms" as="xs:string*" select="tokenize(unparsed-text($search-file), '\r?\n')"/> 

    <xsl:param name="search-terms-is" as="xs:string*" select="for $term in $search-terms return lower-case(functx:escape-for-regex($term))"/> 

    <xsl:param name="replace-terms" as="xs:string*" select="tokenize(unparsed-text($replacement-file), '\r?\n')"/> 

    <xsl:include href="http://www.xsltfunctions.com/xsl/functx-1.0-nodoc-2007-01.xsl"/> 

    <xsl:function name="functx:replace-multi" as="xs:string?" 
     xmlns:functx="http://www.functx.com"> 
     <xsl:param name="arg" as="xs:string?"/> 
     <xsl:param name="changeFrom" as="xs:string*"/> 
     <xsl:param name="changeTo" as="xs:string*"/> 
     <xsl:param name="flags" as="xs:string"/> 

     <xsl:sequence select=" 
      if (count($changeFrom) > 0) 
      then functx:replace-multi(
      replace($arg, $changeFrom[1], 
      functx:if-absent($changeTo[1],''), $flags), 
      $changeFrom[position() > 1], 
      $changeTo[position() > 1]) 
      else $arg 
      "/> 

    </xsl:function> 

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

    <xsl:template match="MANUFACTURER[some $search-term in $search-terms-is satisfies matches(current(), $search-term, 'i')]"> 
     <xsl:copy> 
      <xsl:variable name="matched-terms" as="xs:string*" select="$search-terms-is[matches(current(), ., 'i')]"/> 
      <xsl:variable name="replacements" as="xs:string*" 
       select="for $t in $matched-terms return $replace-terms[index-of($search-terms-is, $t)]"/> 
      <xsl:value-of 
       select="functx:replace-multi(., $matched-terms, $replacements, 'i')"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

toujours eu une erreur, inséré dans la question éditée, au cas où aide, sans savoir ce qui ne va pas avec le dossier 18. Ça va. –

+0

Modifiez la question pour afficher les données de '/ TABLE/DATA [1]/RECORD [18]/MANUFACTURER [1]' –

+0

Vous pouvez essayer de changer ' à ' résout le problème. –