2014-09-19 47 views
0

下面newNode交易替换情况下节点的事务是输入XML:如何使用XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<DST> 
    <CDGCreateTree> 
    <DST> 
     <currentJobName>PQContactComplete</currentJobName> 
     <AWD> 
     <case> 
      <transaction> 
      <UIID>001</UIID> 
      </transaction> 
     </case> 
     <case> 
      <transaction> 
      <UIID>002</UIID> 
      </transaction> 
     </case> 
     </AWD> 
    </DST> 
    </CDGCreateTree> 
    <newNode> 
    <transaction relate="Y" id="1"/> 
    </newNode> 
</DST> 
  1. 在上述XML总2个case S的由具有单个transaction小号
  2. newNode节点包含另一个transaction带有ID(id="1"

我的要求就像我想先替换casetransactionnewNodetransaction

的结果应该是:

<?xml version="1.0" encoding="UTF-8"?> 
<DST> 
    <CDGCreateTree> 
    <DST> 
     <currentJobName>PQContactComplete</currentJobName> 
     <AWD> 
     <case> 
      <transaction relate="Y" id="1"/> 
     </case> 
     <case> 
      <transaction> 
      <UIID>002</UIID> 
      </transaction> 
     </case> 
     </AWD> 
    </DST> 
    </CDGCreateTree> 
</DST> 

在未来,我可能会得到另一个transactionidnewNode节点。下面是XML

<?xml version="1.0" encoding="UTF-8"?> 
<DST> 
    <CDGCreateTree> 
    <DST> 
     <currentJobName>PQContactComplete</currentJobName> 
     <AWD> 
     <case> 
      <transaction relate="Y" id="1"/> 
     </case> 
     <case> 
      <transaction> 
      <UIID>002</UIID> 
      </transaction> 
     </case> 
     </AWD> 
    </DST> 
    </CDGCreateTree> 
    <newNode> 
    <transaction relate="Y" id="2"/> 
    </newNode> 
</DST> 

这个时候我应该newNodetransaction(因为第一casetransaction已经有id值)替换第二casetransaction。 我想以这种方式继续这个过程。

我已经尝试过下面的XSLT,但它没有帮助。如果我错了,请建议更好的方法或纠正我。

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version = "1.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy>   
    </xsl:template> 

    <xsl:variable name="targetNode" select="//newNode/transaction"/> 

    <xsl:template match="(//transaction[ancestor::*[name() = "CDGCreateTree"]][not(@id)])[1]"> 
     <xsl:copy-of select="$targetNode"/> 
    </xsl:template> 

    <xsl:template match="//newNode"> 
    </xsl:template> 

</xsl:stylesheet> 

上述XSL的说明:

(//transaction[ancestor::*[name() = "CDGCreateTree"]][not(@id)])[1]这种说法是定义有关case未具有id和第一transaction(//newNode/transaction)transaction替换transaction

未来,如果我得到任何newNodetransaction它应该被相应地替换为上述XSL。我认为这将按照声明工作,但缺少一些东西。

+0

“*我想第一种情况下交易,以取代NewNode交易*”你为什么想要做这样的事情?第一起案件交易已经存在 - 复制它的意义何在?为什么你想失去有关NewNode交易的信息? – 2014-09-19 08:30:17

+0

1)NewNode事务包含基于大小写事务数据执行的响应 – Hari 2014-09-19 08:41:08

+0

,之后对我们的案例事务数据不再有用,这就是我们删除数据替换newNode事务数据的原因。这是我们需要遵循之前所做的迁移项目。 – Hari 2014-09-19 08:43:39

回答

0

我仍然不知道我理解这个完全,但尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="new-transaction" match="newNode/transaction" use="count(preceding-sibling::transaction)" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="case/transaction[key('new-transaction', count(preceding::transaction))]"> 
    <xsl:copy-of select="key('new-transaction', count(preceding::transaction))"/> 
</xsl:template> 

<xsl:template match="newNode"/> 

</xsl:stylesheet> 

这将更换新老交易,文档顺序,直到有没有更多的进展新的交易(在这种情况下保留剩余的旧交易),或者直到没有更多的旧交易(在这种情况下剩余的新交易被丢弃),这是历来第一次。

应用到mininized输入例如

<?xml version="1.0" encoding="UTF-8"?> 
<DST> 
    <CDGCreateTree> 
    <DST> 
     <currentJobName>PQContactComplete</currentJobName> 
     <AWD> 
     <case> 
      <transaction> 
      <UIID>001</UIID> 
      </transaction> 
     </case> 
     <case> 
      <transaction> 
      <UIID>002</UIID> 
      </transaction> 
     </case> 
     <case> 
      <transaction> 
      <UIID>003</UIID> 
      </transaction> 
     </case> 
     </AWD> 
    </DST> 
    </CDGCreateTree> 
    <newNode> 
    <transaction relate="Y" id="1"/> 
    <transaction relate="Y" id="2"/> 
    </newNode> 
</DST> 

结果将是:

<?xml version="1.0" encoding="UTF-8"?> 
<DST> 
    <CDGCreateTree> 
     <DST> 
     <currentJobName>PQContactComplete</currentJobName> 
     <AWD> 
      <case> 
       <transaction relate="Y" id="1"/> 
      </case> 
      <case> 
       <transaction relate="Y" id="2"/> 
      </case> 
      <case> 
       <transaction> 
        <UIID>003</UIID> 
       </transaction> 
      </case> 
     </AWD> 
     </DST> 
    </CDGCreateTree> 
</DST> 
+0

但我的输入XML像newNode生成一次只包含一个事务,所以我们需要用newNode事务替换每个事务事务。 – Hari 2014-09-19 10:43:14

+0

我已经要求另一篇文章基于我的要求是http://stackoverflow.com/questions/25932290/replacing-nodes-in-xml-using-xslt – Hari 2014-09-19 10:55:30

+0

@哈里恐怕你(再次)不清楚。请采取我最小化的输入示例,编辑它以反映您的输入结构,并将其添加到您的问题。 – 2014-09-19 10:56:56

0
1)In first loop suppose count value contains 1, case transaction replaced with new transaction which contains. 
2)In second loop the count value contains 2, so the second case transaction replaced with newNode transaction which contains. 
3)Always newNode transaction contains new transaction which is generated dynamically. 

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version = "1.0"> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy>   
</xsl:template> 

<xsl:variable name="counter" select="//sample/count"/> 

<xsl:variable name="targetNode" select="//newNode/transaction"/> 

<xsl:template match="case[$counter]/transaction"> 
    <xsl:copy-of select="$targetNode"/> 
</xsl:template> 

<xsl:template match="//sample/count"> 
<count> 
    <xsl:value-of select="$counter + 1"/> 
</count> 
</xsl:template> 

</xsl:stylesheet> 
+0

输入XML不包含'sample'或'count' - 所以这不能成为你所问问题的答案。 – 2014-09-27 13:14:40

+0

在这个xsl之前,我有很多xsl在循环中进行处理,这就是为什么我在此xsl之前在另一个xsl中计数和采样节点的原因。并用“1”初始化计数变量。 – Hari 2014-09-27 17:12:18