XSLT помогает разделить отдельные узлы на совокупность узлов - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть 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 ]

3 голосов
/ 29 ноября 2010

Это очень прямое преобразование:

<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 _».

0 голосов
/ 29 ноября 2010

Функции starts-with() и substring() XPath могут использоваться для разделения узла name() на части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...