2017-06-14 138 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:XML搜索和替换XSL错误

ASUS 
creative 
This is a test. Replace (all) 

replace.txt

GIGABYTE 
LOGITECH 
REPLACEMENT 

和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> 

给作为输出,以下:

<?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> 

应该如何制作使用过的xsl,以便进行精确的搜索和替换?例如,LOGITECH实验室是一个不受欢迎的替代品。我们只想替换每个具有广告词(不区分大小写)的元素,而不是这个词,无论它在MANUFACTURER元素中的哪个位置都可以找到

+1

不要指望我们下载并打开zip文件,试图找出导致问题的数据,然后显示相关样本在你的问题中的片段。我怀疑你的元素包含几个搜索词,你需要在这种情况下解释你想做什么,是否需要全部替换它们。 –

+0

我无法识别导致问题的数据...答案是肯定的,全部替换它们,如果有包含多个搜索词的元素 –

回答

0

我认为错误可能是由包含多个元素搜索词,这里是一个适应代码示例,希望不给这个错误:

<?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

仍然有错误,将它插入编辑的问题中,以防万一帮助,而不知道记录18有什么问题。看起来没问题。 –

+0

编辑问题向我们展示'/ TABLE/DATA [1]/RECORD [18]/MANUFACTURER [1]' –

+0

的数据您可能想尝试是否将'为'解决了这个问题。 –