2017-07-06 50 views
0

我需要用下面的规则从xml转换。 Iam陷入了转型。XSLT转换基于条件获取元素并将其映射到兄弟

规则如下:

对于NS1的每场比赛:与NS1匹配值:帐号/ NS3:政策/ NS3:政策/ NS3:PolicyConditions/NS3:PolicyCondition/NS3:PolicyConditionCriteria/NS3帐户/ ns3:Locations/ns3:Name.I需要获取ns1的值:Account/ns3:Policies/ns3:Policy/ns3:PolicyConditions/ns3:PolicyCondition/ns2:ItemData并创建新标记并将其映射到ns1:Account/NS3:位置/ NS3:LocationConditions/NS3:LocationCondition/NS2:ConditionId和硬编码NS1:帐户/ NS3:位置/ NS3:LocationConditions/NS3:LocationCondition/NS2:ConditionId至0

附加样本输入和预期输出

输入XML:

<ns1:Account xmlns:ns1="API.ExposureWorkflow"> 
    <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
    <ns3:Locations xmlns:ns3="API.Objects.Exposure"> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC1-BU1</ns3:Name> 
     </ns3:Location> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC2-BU1</ns3:Name> 
     </ns3:Location> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC2-BU3</ns3:Name> 
     </ns3:Location> 
    </ns3:Locations> 
    <ns3:Policies xmlns:ns3="API.Objects.Exposure"> 
     <ns3:Policy> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:PolicyConditions> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns3:PolicyConditionCriterias/> 
      </ns3:PolicyCondition> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ItemData xmlns:ns2="API.Objects">28</ns2:ItemData> 
       <ns3:Name>EQ Blanket28</ns3:Name> 
       <ns3:PolicyConditionCriterias> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC1-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC2-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
       </ns3:PolicyConditionCriterias> 
      </ns3:PolicyCondition> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ItemData xmlns:ns2="API.Objects">29</ns2:ItemData> 
       <ns3:Name>EQ Blanket29</ns3:Name> 
       <ns3:PolicyConditionCriterias> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC1-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC2-BU3</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
       </ns3:PolicyConditionCriterias> 
      </ns3:PolicyCondition> 
     </ns3:PolicyConditions> 
     </ns3:Policy> 
    </ns3:Policies> 
</ns1:Account> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="API.ExposureWorkflow" xmlns:ns2="API.Objects" xmlns:ns3="API.Objects.Exposure"> 
       <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 



       <!-- template to copy elements --> 
       <xsl:template match="*"> 
           <xsl:element name="{name()}"> 
               <xsl:apply-templates select="@* | node()"/> 
           </xsl:element> 
       </xsl:template> 
       <!-- template to copy attributes --> 
       <xsl:template match="@*"> 
           <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute> 
       </xsl:template> 
       <!-- template to copy the rest of the nodes --> 
       <xsl:template match="comment() | text() | processing-instruction()"> 
           <xsl:copy/> 
       </xsl:template> 
</xsl:stylesheet> 

预计输出继电器:

<ns1:Account xmlns:ns1="API.ExposureWorkflow"> 
    <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
    <ns3:Locations xmlns:ns3="API.Objects.Exposure"> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC1-BU1</ns3:Name> 
      <ns3:LocationConditions> 
      <ns3:LocationCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ConditionId xmlns:ns2="API.Objects">28</ns2:ConditionId> 
      </ns3:LocationCondition> 
      <ns3:LocationCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ConditionId xmlns:ns2="API.Objects">29</ns2:ConditionId> 
      </ns3:LocationCondition> 
     </ns3:LocationConditions> 
     </ns3:Location> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC2-BU1</ns3:Name> 
     <ns3:LocationConditions> 
      <ns3:LocationCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ConditionId xmlns:ns2="API.Objects">28</ns2:ConditionId> 
      </ns3:LocationCondition> 
     </ns3:LocationConditions> 
     </ns3:Location> 
     <ns3:Location> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:Name>LOC2-BU3</ns3:Name> 
     <ns3:LocationConditions> 
      <ns3:LocationCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ConditionId xmlns:ns2="API.Objects">29</ns2:ConditionId> 
      </ns3:LocationCondition> 
     </ns3:LocationConditions> 
     </ns3:Location> 
    </ns3:Locations> 
    <ns3:Policies xmlns:ns3="API.Objects.Exposure"> 
     <ns3:Policy> 
     <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
     <ns3:PolicyConditions> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns3:PolicyConditionCriterias/> 
      </ns3:PolicyCondition> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ItemData xmlns:ns2="API.Objects">28</ns2:ItemData> 
       <ns3:Name>EQ Blanket28</ns3:Name> 
       <ns3:PolicyConditionCriterias> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC1-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC2-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
       </ns3:PolicyConditionCriterias> 
      </ns3:PolicyCondition> 
      <ns3:PolicyCondition> 
       <ns2:Id xmlns:ns2="API.Objects">0</ns2:Id> 
       <ns2:ItemData xmlns:ns2="API.Objects">29</ns2:ItemData> 
       <ns3:Name>EQ Blanket29</ns3:Name> 
       <ns3:PolicyConditionCriterias> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC1-BU1</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
        <ns3:PolicyConditionCriteria> 
        <ns3:Value>LOC2-BU3</ns3:Value> 
        </ns3:PolicyConditionCriteria> 
       </ns3:PolicyConditionCriterias> 
      </ns3:PolicyCondition> 
     </ns3:PolicyConditions> 
     </ns3:Policy> 
    </ns3:Policies> 
</ns1:Account> 
+0

我很抱歉,但我们不是一个代码编写的服务。具体来说,你挂断了什么?你提供的XSL只是一个不必要的复杂变体 - 这是一个开始的好地方(+/-“不必要的复杂”部分),但它没有表现出真正的努力来解决问题为自己。 –

回答

0

我设法翻译XML,只是在想,如果有任何更好的简单方法实行。

<xsl:for-each select="ns3:Location"> 
     <xsl:variable name="locationName"> 
      <xsl:value-of select="ns3:Name" /> 
     </xsl:variable> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
      <ns3:LocConditions> 
       <xsl:for-each select="//ns3:PolicyConditions/ns3:PolicyCondition"> 
        <xsl:for-each 
         select="ns3:PolicyConditionCriterias/ns3:PolicyConditionCriteria"> 
         <xsl:if test="ns3:Value=$locationName"> 
          <!--Zero or more repetitions: --> 
          <ns3:LocCondition> 
           <ns2:Id>0</ns2:Id> 

           <ns2:ConditionId> 
            <xsl:value-of select="../../ns2:ItemData" /> 

           </ns2:ConditionId> 
          </ns3:LocCondition> 
         </xsl:if> 
        </xsl:for-each> 
       </xsl:for-each> 
      </ns3:LocConditions> 
     </xsl:copy> 
    </xsl:for-each> 

</xsl:template> 



      <!-- template to copy elements --> 
      <xsl:template match="*"> 
          <xsl:element name="{name()}"> 
              <xsl:apply-templates select="@* | node()"/> 
          </xsl:element> 
      </xsl:template> 
      <!-- template to copy attributes --> 
      <xsl:template match="@*"> 
          <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute> 
      </xsl:template> 
      <!-- template to copy the rest of the nodes --> 
      <xsl:template match="comment() | text() | processing-instruction()"> 
          <xsl:copy/> 
      </xsl:template>