在使用XSLT一种特定的方式重新排列XML元素 [英] Re-order XML elements in a specific way using XSLT

查看:108
本文介绍了在使用XSLT一种特定的方式重新排列XML元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个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 =htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆