根据xsl中的某些规则从外部xml中提取值

时间:2015-11-02 10:40:40

标签: xslt-2.0

这是输入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>

这是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>

这是期望的输出

    <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代码/文本匹配remotelink/@refptid而不是prop.xml的copy属性到remotelink,否则remotelink没有更改。

这是XSLT,到目前为止我还没有得到,没有得到无与伦比的结果:

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

2 个答案:

答案 0 :(得分:0)

永远不会触发

<xsl:template match="remotelink[@service='DOC-ID']">service元素上没有<remotelink>属性。此外,您无法检索到正确的属性(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>

答案 1 :(得分: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>

,与您的第一个模板一起,就足够了。