XSLT有助于将各个节点拆分为节点集合

时间:2010-11-29 05:13:07

标签: xslt

我的XML看起来像

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>9</BBB_ID>
  <CCC_COURIER>2</CCC_COURIER>
  <CCC_FAX>33.44</CCC_FAX>
  <CCC_COFFEE>9</CCC_COFFEE>
  <CCC_MARSBARS>3000.43</CCC_MARSBARS>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>10</BBB_ID>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>11</BBB_ID>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>12</BBB_ID>
  <CCC_MISC>5</CCC_MISC>
 </ROW>
</ROWSET>

我需要对其进行修改,使其最终看起来像

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>9</BBB_ID>
  <CCC>
   <CODE>COURIER</CODE>
   <AMOUNT>2</AMOUNT>
  </CCC>
  <CCC>
   <CODE>FAX</CODE>
   <AMOUNT>33.44</AMOUNT>
  </CCC>
  <CCC>
   <CODE>COFFEE</CODE>
   <AMOUNT>9</AMOUNT>
  </CCC>
  <CCC>
   <CODE>MARSBARS</CODE>
   <AMOUNT>3000.34</AMOUNT>
  </CCC>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>10</BBB_ID>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>11</BBB_ID>
 </ROW>
 <ROW>
  <AAA_ID>43238</AAA_ID>
  <BBB_ID>12</BBB_ID>
  <CCC>
   <CODE>MISC</CODE>
   <AMOUNT>5</AMOUNT>
  </CCC>
 </ROW>
</ROWSET>

现在我有ZERO XSL经验,但我的表现并不是太糟糕但是我最大的绊脚石是如何拆分CCC _ ????节点进入单个节点并放入????代码值进入它自己的节点?

最迫切地接受任何和所有帮助!

2 个答案:

答案 0 :(得分:3)

这是非常直接的转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[starts-with(name(),'CCC_')]">
        <CCC>
            <CODE>
                <xsl:value-of select="substring-after(name(),'CCC_')"/>
            </CODE>
            <AMOUNT>
                <xsl:value-of select="."/>
            </AMOUNT>
        </CCC>
    </xsl:template>
</xsl:stylesheet>

输出:

<ROWSET>
    <ROW>
        <AAA_ID>43238</AAA_ID>
        <BBB_ID>9</BBB_ID>
        <CCC>
            <CODE>COURIER</CODE>
            <AMOUNT>2</AMOUNT>
        </CCC>
        <CCC>
            <CODE>FAX</CODE>
            <AMOUNT>33.44</AMOUNT>
        </CCC>
        <CCC>
            <CODE>COFFEE</CODE>
            <AMOUNT>9</AMOUNT>
        </CCC>
        <CCC>
            <CODE>MARSBARS</CODE>
            <AMOUNT>3000.43</AMOUNT>
        </CCC>
    </ROW>
    <ROW>
        <AAA_ID>43238</AAA_ID>
        <BBB_ID>10</BBB_ID>
    </ROW>
    <ROW>
        <AAA_ID>43238</AAA_ID>
        <BBB_ID>11</BBB_ID>
    </ROW>
    <ROW>
        <AAA_ID>43238</AAA_ID>
        <BBB_ID>12</BBB_ID>
        <CCC>
            <CODE>MISC</CODE>
            <AMOUNT>5</AMOUNT>
        </CCC>
    </ROW>
</ROWSET>

注意:按原样复制输入的标识规则。覆盖名称以“CCC _”开头的元素的标识规则。

答案 1 :(得分:0)

可以使用starts-with()substring() XPath functions将节点name()分割成碎片。