2015-11-02 60 views
1

這是輸入XML input.xml中提取值

<root> 
    <bodytext> 
    <remotelink refptid="HKBL1.0001.lohk.CAP65">some text</remotelink> 
    <remotelink refptid="HKBL1.0001.lohk.CAP199999">some text</remotelink> 
    </bodytext> 
    </root> 

這是這是所需的輸出

<root> 
    <bodytext> 
    <remotelink refptid="HKBL1.0001.lohk.CAP65" dpsi="0BZG" docid="asdww">some text</remotelink> 
    <remotelink refptid="HKBL1.0001.lohk.CAP199999">some text</remotelink> 
    </bodytext> 
    </root> 
Prop.xml

<?xml version="1.0" encoding="utf-8"?> 
    <properties> 
    <code dpsi="0BZG" docid="asdww">HKBL1.0001.lohk.CAP65</code> 
    <code dpsi="0BZH" docid="navin">HKBL1.0002.aohk.CAP383</code> 
    <code no="3">345</code> 
    </properties> 

如果prop.xml代碼/文本匹配remotelink/@refptid比prop.xml的複製屬性更改爲remotelink,否則remotelink中沒有更改。

這是XSLT,我至今wrriten,不是無與倫比的條件得到結果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlsx="http://www.stylusstudio.com/XSLT/XLSX" xmlns:spml="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:saxon="http://saxon.sf.net/" version="2.0"> 
    <xsl:template match="@*|node()" name="root"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="remotelink[@service='DOC-ID']" name="t-remote"> 
    <xsl:variable name="refptid" select="./@refpt"/>  
    <xsl:variable name="path" select="doc('file:/C:/Users/DalalNS/Desktop/xslt/prop.xml')"/> 
    <xsl:for-each select="$path/properties/code"> 
    <xsl:choose> 
    <xsl:when test="./text()=$refptid"> 
    <xsl:element name="remotelink">  
    <xsl:attribute name="DOC-ID" select="./@docid"/> 
    <xsl:attribute name="dpsi" select="./@dpsi"/> 
    <xsl:attribute name="refpt" select="$refptid"/> 
    </xsl:element> 
    </xsl:when> 
     <xsl:otherwise> 
     </xsl:otherwise> 
    </xsl:choose>  
    </xsl:for-each> 


    <xsl:if test="./@docrefid"/> 

    </xsl:template> 
    </xsl:stylesheet> 

回答

0

<xsl:template match="remotelink[@service='DOC-ID']">將永遠永遠被觸發,還有的<remotelink>元件沒有service屬性。此外,你不檢索正確的屬性(的refpt代替refptid

這XSL轉換應該做的工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlsx="http://www.stylusstudio.com/XSLT/XLSX" xmlns:spml="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:saxon="http://saxon.sf.net/" version="2.0"> 

    <xsl:variable name="props.doc" select="doc('file:/C:/Users/DalalNS/Desktop/xslt/prop.xml')/properties" /> 

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

    <xsl:template match="remotelink" name="t-remote"> 
     <xsl:variable name="refptid" select="./@refptid"/> 

     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:if test="$props.doc/code[. = $refptid]"> 
       <xsl:apply-templates select="$props.doc/code[. = $refptid]/@*"/>     
      </xsl:if> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 

    </xsl:template> 
</xsl:stylesheet> 

這是轉型的結果:

<?xml version="1.0" encoding="UTF-8"?><root> 
<bodytext> 
    <remotelink refptid="HKBL1.0001.lohk.CAP65" dpsi="0BZG" docid="asdww">some text</remotelink> 
    <remotelink refptid="HKBL1.0001.lohk.CAP199999">some text</remotelink> 
</bodytext> 
</root> 
0

我會簡單地定義一個全局參數或變量<xsl:variable name="path" select="doc('file:/C:/Users/DalalNS/Desktop/xslt/prop.xml')"/>,然後設置一個密鑰<xsl:key name="prop" match="code" use="."/>,然後在模板中使用它

<xsl:template match="remotelink[key('prop', @refptid, $path)]"> 
    <xsl:copy> 
    <xsl:copy-of select="key('prop', @refptid, $path)/@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

與您的第一個模板一起就足夠了。