合并 XSLT 版本 1.0 或 2.0 中的多个节点

发布于 2025-01-11 08:24:17 字数 4923 浏览 0 评论 0 原文

合并条件-->以下是合并示例 xml 的条件

 1. Merge multiple nodes based on Operations and 
 2. Attribute with value as 

/:Request/:Attribute[:Name='ID']/:Value/*:NewValue**

 Input XML message-->
    
   <?xml version = '1.0' encoding = 'UTF-8'?>
<tns:Requests xmlns:tns="http://sample.com/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sample.com/v1">
   <?audit suppress oracle.ide.xml.validation-error?>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Modify</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>999</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>TITLE</tns:Name>
         <tns:Value>
              <tns:NewValue>Manager</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Modify</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>999</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>COUNTRY</tns:Name>
         <tns:Value>
            <tns:NewValue>Ghana</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Disable</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>888</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>STATUS</tns:Name>
         <tns:Value>
            <tns:NewValue>Inactive</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
</tns:Requests>
  1. 需要使用XSLT 将输入 xml 消息转换为预期输出

    **预期输出**
    
    
    
      <?审核抑制 oracle.ide.xml.validation-error?>
      
        ABC
        修改
        
          ID
          
            999
          
        
        
          标题
          
            管理器
          
        
        
          国家/地区
          
            美国
          
        
      
      
        ABC
        禁用
        
          ID
          
            888
          
        
        
          状态
          
            非活动
          
        
      
    
    
  2. 无法按照输出部分中的说明使用基于多个属性的 xslt 合并多个节点

  3. 如何根据属性进行分组

    代码

     
     
     
       
       
         
           
         
       
       
         
           
           
             <请求>
               <系统>ABC
               <操作>
                 
               
              
                  <属性>
              <名称>ID
              <值>
                 <新价值> 
              
           
           
          <属性>
             <名称> 
              <值>
                 <新值> <名称> 
              
           
            
                 
             
    
           
         
       
     
    

Condition to merge --> Below are condition to merge sample xml

 1. Merge multiple nodes based on Operations and 
 2. Attribute with value as 

/:Request/:Attribute[:Name='ID']/:Value/*:NewValue**

 Input XML message-->
    
   <?xml version = '1.0' encoding = 'UTF-8'?>
<tns:Requests xmlns:tns="http://sample.com/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sample.com/v1">
   <?audit suppress oracle.ide.xml.validation-error?>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Modify</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>999</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>TITLE</tns:Name>
         <tns:Value>
              <tns:NewValue>Manager</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Modify</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>999</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>COUNTRY</tns:Name>
         <tns:Value>
            <tns:NewValue>Ghana</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
   <tns:Request>
      <tns:System>ABC</tns:System>
      <tns:Operation>Disable</tns:Operation>
      <tns:Attribute>
         <tns:Name>ID</tns:Name>
         <tns:Value>
            <tns:NewValue>888</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
      <tns:Attribute>
         <tns:Name>STATUS</tns:Name>
         <tns:Value>
            <tns:NewValue>Inactive</tns:NewValue>
         </tns:Value>
      </tns:Attribute>
   </tns:Request>
</tns:Requests>
  1. Need to use XSLT to transform input xml message to expected output

    **Expected Output**
    
    <?xml version="1.0" encoding="UTF-8"?>
    <tns:Requests xmlns:tns="http://sample.com/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sample.com/v1">
      <?audit suppress oracle.ide.xml.validation-error?>
      <tns:Request>
        <tns:System>ABC</tns:System>
        <tns:Operation>Modify</tns:Operation>
        <tns:Attribute>
          <tns:Name>ID</tns:Name>
          <tns:Value>
            <tns:NewValue>999</tns:NewValue>
          </tns:Value>
        </tns:Attribute>
        <tns:Attribute>
          <tns:Name>TITLE</tns:Name>
          <tns:Value>
            <tns:NewValue>Manager</tns:NewValue>
          </tns:Value>
        </tns:Attribute>
        <tns:Attribute>
          <tns:Name>COUNTRY</tns:Name>
          <tns:Value>
            <tns:NewValue>USA</tns:NewValue>
          </tns:Value>
        </tns:Attribute>
      </tns:Request>
      <tns:Request>
        <tns:System>ABC</tns:System>
        <tns:Operation>Disable</tns:Operation>
        <tns:Attribute>
          <tns:Name>ID</tns:Name>
          <tns:Value>
            <tns:NewValue>888</tns:NewValue>
          </tns:Value>
        </tns:Attribute>
        <tns:Attribute>
          <tns:Name>STATUS</tns:Name>
          <tns:Value>
            <tns:NewValue>Inactive</tns:NewValue>
          </tns:Value>
        </tns:Attribute>
      </tns:Request>
    </tns:Requests>
    
  2. Not able to merge multiple nodes as explain in output section using xslt based on multiple attribute

  3. How to group based on Attribute

    Code

     <?xml version="1.0"?>
     <!-- current-grouping-key.xsl -->
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
       <xsl:output method="xml" indent="yes"/>
       <xsl:template match="@*|node()" name="identity">
         <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
       </xsl:template>
       <xsl:template match="Requests">
         <xsl:copy>
           <xsl:apply-templates select="@*|* except Request"/>
           <xsl:for-each-group select="Request" group-by="Operation">
             <Request>
               <System>ABC</System>
               <Operation>
                 <xsl:value-of select="current-grouping-key()"/>
               </Operation>
              <xsl:for-each-group select="Attribute" group-by="NewValue">
                  <Attribute>
              <Name>ID</Name>
              <Value>
                 <NewValue>  <xsl:value-of select="current-grouping-key()"/></NewValue>
              </Value>
           </Attribute>
           <xsl:for-each select="current-group()">
          <Attribute>
             <Name> <xsl:value-of select="Name"/></Name>
              <Value>
                 <NewValue><Name> <xsl:value-of select="NewValue"/></Name></NewValue>
              </Value>
           </Attribute>
           </xsl:for-each> 
                 </xsl:for-each-group>
             </Request>
    
           </xsl:for-each-group>
         </xsl:copy>
       </xsl:template>
     </xsl:stylesheet>
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深府石板幽径 2025-01-18 08:24:17

我想你想要

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xpath-default-namespace="http://sample.com/v1">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="@*|node()" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
   </xsl:template>
   <xsl:template match="Requests">
     <xsl:copy>
       <xsl:apply-templates select="@*|* except Request"/>
       <xsl:for-each-group select="Request" group-by="Operation">
         <xsl:copy>
           <xsl:apply-templates select="System, Operation"/>
           <xsl:for-each-group select="current-group()/Attribute" group-by="Value/NewValue">
              <xsl:copy>
                <xsl:apply-templates select="Name, Value"/>
              </xsl:copy>
           </xsl:for-each-group>
         </xsl:copy>
       </xsl:for-each-group>
     </xsl:copy>
   </xsl:template>
 </xsl:stylesheet>

I think you want

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xpath-default-namespace="http://sample.com/v1">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="@*|node()" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
   </xsl:template>
   <xsl:template match="Requests">
     <xsl:copy>
       <xsl:apply-templates select="@*|* except Request"/>
       <xsl:for-each-group select="Request" group-by="Operation">
         <xsl:copy>
           <xsl:apply-templates select="System, Operation"/>
           <xsl:for-each-group select="current-group()/Attribute" group-by="Value/NewValue">
              <xsl:copy>
                <xsl:apply-templates select="Name, Value"/>
              </xsl:copy>
           </xsl:for-each-group>
         </xsl:copy>
       </xsl:for-each-group>
     </xsl:copy>
   </xsl:template>
 </xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文