Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相互检查两个不同xml文档的值_Xml_Xslt_Nextsibling - Fatal编程技术网

相互检查两个不同xml文档的值

相互检查两个不同xml文档的值,xml,xslt,nextsibling,Xml,Xslt,Nextsibling,我正在处理2个XML文档,并尝试在匹配变量的情况下从一个文档到另一个文档获取一个值。第一个XML文档是转换后的电子表格,格式如下: <Doc1> <row> <cell>VA15</cell> <cell>wr23</cell> </row> <row> <cell>VA45</cell> <cell

我正在处理2个XML文档,并尝试在匹配变量的情况下从一个文档到另一个文档获取一个值。第一个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>
我正在尝试使用xslt转换来测试
id
元素是否与doc1中
单元格的值匹配,它会提取前面
单元格的值。在本例中,我希望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>

因为文档节点没有同级

.2。具有名为
单元格的元素的文档没有名为
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()"/>

因为文档节点没有同级

.2。具有名为
单元格的元素的文档没有名为
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的答案,您可以使用
key()
(用于快速查找)和
调用模板将此“查找IDREF”模式提取到单独的模板中:

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>
<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参数更改查找文档:

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

无论您使用的是什么XSLT处理器,都可以通过某种方式指定模板参数。

基于Dimitre的答案,您可以使用
key()
(用于快速查找)和
调用模板
,将此“查找IDREF”模式抽象为单独的模板:

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>
<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参数更改查找文档:

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

您使用的任何XSLT处理器都可以通过某种方式指定模板参数。

Doc1.xml
是无效的xml。只是一个输入错误?是的,我有一个>应该有一个
Doc1.xml
是无效的xml。只是一个输入错误?是的,我有一个>应该有一个