检查2个不同的xml文档的值彼此

问题描述:

我正在处理2个XML文档,并试图从一个文档中获取值,如果一个变量匹配。第一XML文档被转换后的电子表格格式,如:检查2个不同的xml文档的值彼此

<Doc1> 
    <row> 
     <cell>VA15</cell> 
     <cell>wr23</cell> 
    </row> 
    <row> 
     <cell>VA45</cell> 
     <cell>wr27</cell> 
    </row>  <row> 
     <cell>VA78</cell> 
     <cell>wr24</cell> 
    </row> 
</Doc1> 

第二XML文档是一个较长的一个在其内部有一个id元件相匹配的电子表格的一部分:

<Doc2> 
<p> text text text 
    <id>wr23</id> 
</p> 
</Doc2> 

我尝试使用我的xslt转换来测试以查看id元素是否与doc1中的cell的值相匹配,它将拉取前面的cell的值。在这种情况下,我希望xslt转换输出“VA15”。我试过以下代码的各种排列而没有成功,有没有人有任何想法?

<xsl:for-each select="document('Doc1.xml')//row"> 
    <xsl:if test="/cell=//id'"> 
    <xsl:value-of select="/preceding-sibling::cell"/> 
    </xsl:if> 
</xsl:for-each> 
+0

'Doc1.xml'是无效的XML。只是一个错字? –

+0

是的,我有一个地方应该有一个 user1748728

<xsl:for-each select="document('Doc1.xml')//row"> 
    <xsl:if test="/cell=//id'"> 
    <xsl:value-of select="/preceding-sibling::cell"/> 
    </xsl:if> 
</xsl:for-each> 

许多问题:

  1. 两个文件中都没有命名cell顶部元件 - 你必须使用一个相对的而不是绝对的表达:

.....

cell = //id 

preceding-sibling::cell 

因为文档节点没有兄弟姐妹。

.2。具有名为cell的元素的文档不具有名为id的元素。当XPath表达式引用多个文档时,除了一个文档之外的所有文档都必须明确引用。与所有的修正,你的代码变得像这样:

<xsl:variable name="vthisDoc" select="/"/> 

    <xsl:for-each select="document('Doc1.xml')//row"> 
    <xsl:if test="cell=$vthisDoc//id'"> 
     <xsl:value-of select="preceding-sibling::cell"/> 
    </xsl:if> 
    </xsl:for-each> 

最后,这一切都可以在短期内书面:

<xsl:copy-of select= 
"document('Doc1.xml')//row[cell=$vthisDoc//id]/preceding-sibling::cell[1]/text()"/> 

大厦Dimitre的回答,您可以抽象的这种“抬头一IDREF”模式伸到使用key()(快速查找)和call-template一个单独的模板:

ID-lookup.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:param name="id-lookup-doc">Doc1.xml</xsl:param> 
<xsl:variable name="id-to-value-doc" select="document($id-lookup-doc)"/> 

<xsl:key name="value-for-id" 
    match="/Doc1/row/cell[1]" 
    use="../cell[2]" /> 


<xsl:template name="value-for-id"> 
    <xsl:param name="id"/> 
    <!-- for-each is just to change the context 
     to limit results from key() to the lookup document --> 
    <xsl:for-each select="$id-to-value-doc"> 
     <xsl:value-of select="key('value-for-id', $id)"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

取代-ID与 - value.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:import href="id-lookup.xsl"/> 

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

<xsl:template match="id"> 
    <val> 
     <xsl:apply-templates select="@*"/> 
     <xsl:call-template name="value-for-id"> 
      <xsl:with-param name="id" select="text()"/> 
     </xsl:call-template> 
    </val> 
</xsl:template> 

</xsl:stylesheet> 

当你通过XSLT处理器运行它,你会得到与<val>全部换成<id>元素和相应的值的文件。

使用xsltproc,你会这样运行的:

xsltproc id-with-value.xsl Doc2.xml myOtherDoc.xml 

您可以使用XSLT PARAM甚至改变查找文件:

xsltproc --stringparam id-lookup-doc MyOtherSetOfIdsAndValues.xml id-with-value.xsl Doc2.xml 

无论XSLT你使用会产生一定的方式处理器指定模板参数。