检查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>
答
<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>
许多问题:
- 两个文件中都没有命名
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你使用会产生一定的方式处理器指定模板参数。
'Doc1.xml'是无效的XML。只是一个错字? –
是的,我有一个地方应该有一个 user1748728