在使用XSLT一种特定的方式重新排列XML元素 [英] Re-order XML elements in a specific way using XSLT
问题描述
我有两个XSL变量。
1.ProductID
< prdid>
<&ID GT; 8143794< / ID>
<&ID GT; 8143793< / ID>
<&ID GT; 8142229< / ID>
<&ID GT; 8143796< / ID>
< / prdid>
2.Productxml
<根和GT;
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8142229< / ID>
< isp_brand额外=isp_brand>< / isp_brand>
< isp_produktserie额外=isp_produktserie>< / isp_produktserie>
< isp_model额外=isp_model>< / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143793< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model>&育成LT; / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143794< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
<产品>
<&ID GT; 8143796< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
< /根>
现在我要的是,在for循环中我想在每个productxml产品,从prdid XML订单
像
<的xsl:for-每个选择=prdid / ID>
<! - 我想从这里productxml其中得到了相同的id在for循环的产物节点 - >
<的xsl:value-of的选择=productxml / ID/>
< /的xsl:for-每个>
这个转变是高效短
<的xsl:样式版本=1.0的xmlns:XSL =http://www.w3.org/1999/XSL/Transform>
< XSL:输出中省略的XML声明=YES缩进=YES/>
< XSL:带状空间元素=*/> < XSL:变量名=vProds选择=
文件(文件:/// C:/temp/delete/products.xml')/> < XSL:关键NAME =kProdById匹配=产品使用=ID/> <的xsl:模板匹配=/ *>
<根和GT;< XSL:申请模板/>< /根>
< / XSL:模板> <的xsl:模板匹配=ID>
< XSL:变量名=VID选择= />中。
<的xsl:for-每个选择=$ vProds>
< XSL:选择=键('kProdById',$ VID)/&GT复制的;
< /的xsl:for-每个>
< / XSL:模板>
< / XSL:样式>
当施加的规定prdidXML文档
< prdid>
<&ID GT; 8143794< / ID>
<&ID GT; 8143793< / ID>
<&ID GT; 8142229< / ID>
<&ID GT; 8143796< / ID>
< / prdid>
第二提供的文档文件中包含的: C:\\ TEMP \\删除\\ products.xml
:
<根和GT;
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8142229< / ID>
< isp_brand额外=isp_brand>< / isp_brand>
< isp_produktserie额外=isp_produktserie>< / isp_produktserie>
< isp_model额外=isp_model>< / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143793< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model>&育成LT; / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143794< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
<产品>
<&ID GT; 8143796< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
< /根>
通缉,正确的结果产生:
<根和GT;
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143794< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8143793< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model>&育成LT; / isp_model>
< /产品>
<产品>
&所述; estocklevel大于0&下; / estocklevel>
<&ID GT; 8142229< / ID>
< isp_brand额外=isp_brand/>
< isp_produktserie额外=isp_produktserie/>
< isp_model额外=isp_model/>
< /产品>
<产品>
<&ID GT; 8143796< / ID>
< isp_brand额外=isp_brand>的Leitz< / isp_brand>
&所述; isp_produktserie额外=isp_produktserie> 180℃; / isp_produktserie>
< isp_model额外=isp_model> SmaI位< / isp_model>
< /产品>
< /根>
说明
正确使用 键
这表明如何与XSLT 1.0从一个XML文档在另一个XML文档节点键的值来使用。
I have two XSL variables. 1.ProductID
<prdid>
<id>8143794</id>
<id>8143793</id>
<id>8142229</id>
<id>8143796</id>
</prdid>
2.Productxml
<root>
<product>
<estocklevel>0</estocklevel>
<id>8142229</id>
<isp_brand extra="isp_brand"></isp_brand>
<isp_produktserie extra="isp_produktserie"></isp_produktserie>
<isp_model extra="isp_model"></isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8143793</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Bred</isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8143794</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
<product>
<id>8143796</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
</root>
Now what i want is, in a for loop i want to get each products in productxml ,in an order from prdid XML like
<xsl:for-each select="prdid/id">
<!--i want to get a product node from productxml here which got same id of that in this for loop -->
<xsl:value-of select="productxml/id"/>
</xsl:for-each>
This transformation is short and efficient:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vProds" select=
"document('file:///c:/temp/delete/products.xml')"/>
<xsl:key name="kProdById" match="product" use="id"/>
<xsl:template match="/*">
<root><xsl:apply-templates/></root>
</xsl:template>
<xsl:template match="id">
<xsl:variable name="vId" select="."/>
<xsl:for-each select="$vProds">
<xsl:copy-of select="key('kProdById', $vId)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
When it is applied on the provided "prdid" XML document:
<prdid>
<id>8143794</id>
<id>8143793</id>
<id>8142229</id>
<id>8143796</id>
</prdid>
and the second provided document is contained in the file: c:\temp\delete\products.xml
:
<root>
<product>
<estocklevel>0</estocklevel>
<id>8142229</id>
<isp_brand extra="isp_brand"></isp_brand>
<isp_produktserie extra="isp_produktserie"></isp_produktserie>
<isp_model extra="isp_model"></isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8143793</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Bred</isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8143794</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
<product>
<id>8143796</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
</root>
the wanted, correct result is produced:
<root>
<product>
<estocklevel>0</estocklevel>
<id>8143794</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8143793</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Bred</isp_model>
</product>
<product>
<estocklevel>0</estocklevel>
<id>8142229</id>
<isp_brand extra="isp_brand"/>
<isp_produktserie extra="isp_produktserie"/>
<isp_model extra="isp_model"/>
</product>
<product>
<id>8143796</id>
<isp_brand extra="isp_brand">Leitz</isp_brand>
<isp_produktserie extra="isp_produktserie">180</isp_produktserie>
<isp_model extra="isp_model">Smal</isp_model>
</product>
</root>
Explanation:
Proper use of keys.
This demonstrates how to use with XSLT 1.0 a value from one XML document as a key for nodes in another XML document.
这篇关于在使用XSLT一种特定的方式重新排列XML元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!