1

...或者也许以某种方式获得孩子的内容?

大家好,我正在使用 STX,因为我有大量的 XML 文件。

我有一些意见

<?xml version="1.0" encoding="UTF-8"?>
<ME>
  <DataContainer id="1">
    <attributes>
      <DataType>vsDataF</DataType>
      <vsDataF>
        <label>lable-F</label>
        <zzz>100</zzz>
      </vsDataF>
    </attributes>
    <DataContainer id="1">
      <attributes>
        <DataType>vsData1</DataType>
        <vsData1>
          <label>lable-1</label>
          <zzz>1000</zzz>
        </vsData1>
      </attributes>
    </DataContainer>
    <DataContainer id="1">
      <attributes>
        <DataType>vsData2</DataType>
        <vsData2>
          <label>lable-2</label>
          <zzz>2000</zzz>
        </vsData2>
      </attributes>
    </DataContainer>
  </DataContainer>
  <DataContainer id="2">
    <attributes>
      <DataType>vsDataG</DataType>
      <vsDataG>
        <label>lable-G</label>
        <zzz>200</zzz>
      </vsDataG>
    </attributes>
</ME>

我需要得到这样的输出

<?xml version="1.0" encoding="UTF-8"?>
<main>
  <vsDataF>
    <id>1</id>
    <label>lable-F</label>
    <zzz>100</zzz>
    <vsData1>
      <id>1</id>
      <label>lable-1</label>
      <zzz>1000</zzz>
    </vsData1>
    <vsData2>
      <id>1</id>
      <label>lable-2</label>
      <zzz>2000</zzz>
    </vsData2>
  </vsDataF>
  <vsDataG>
    <id>2</id>
    <label>lable-G</label>
    <zzz>200</zzz>
  </vsDataG>
</main>

我写了一个部分完成的转换

<stx:transform
  version="1.0"
  xmlns:stx="http://stx.sourceforge.net/2002/ns"
  output-method="xml">

  <stx:variable name="table_name"/>

  <stx:template match="/">
    <main>
      <stx:process-children/>
    </main>
  </stx:template>

  <!-- DataContainters -->
  <stx:template match="ME/DataContainer/attributes/DataType">
    <stx:assign name="table_name" select="."/>
    <stx:element name="{$table_name}">
      <id>
        <stx:value-of select="../../@id"/>
      </id>
    </stx:element>
  </stx:template>

</stx:transform>

我知道,stx:process 很少,例如 stx:process-children、stx:process-self、stx:process-siblings,但这种情况下它不起作用。

4

1 回答 1

1

我已经解决了这个问题。我学会了如何stx:group工作stx:buffer,这对我来说很困难,但我设法做到了。

<stx:transform
  version="1.0"
  xmlns:stx="http://stx.sourceforge.net/2002/ns"
  output-method="xml">

  <stx:variable name="table_name"/>
  <stx:buffer name="columns"/>

  <stx:template match="/">
    <main>
      <stx:process-children/>
    </main>
  </stx:template>

  <stx:group name="copy-all" pass-through="all"/>

  <!-- Columns -->
  <stx:template match="DataContainer/attributes/*[2]/*">
    <stx:element name="{local-name()}">
      <stx:value-of select="."/>
    </stx:element>
  </stx:template>

  <!-- DataType --> 
  <stx:template match="DataContainer/attributes/*[2]">
    <stx:assign name="table_name" select="local-name()"/>
    <stx:result-buffer name="columns" clear="yes">
      <stx:process-children/>
    </stx:result-buffer>
  </stx:template>

  <!-- DataContainer -->
  <stx:template match="DataContainer/*[1]" priority="2">
    <stx:process-self/>
    <stx:element name="{$table_name}">
      <id>
        <stx:value-of select="../@id"/>
      </id>
      <stx:process-buffer name="columns" group="copy-all"/>
      <stx:process-siblings/>
    </stx:element>
  </stx:template>

</stx:transform>
于 2014-12-08T20:44:39.107 回答