【问题标题】:STX: How to process elements that have a more higher level than a matched element has?STX:如何处理比匹配元素更高级别的元素?
【发布时间】:2015-01-30 15:48:25
【问题描述】:

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

大家好,我正在使用 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,但是这种情况下它不起作用。

【问题讨论】:

    标签: xml stx


    【解决方案1】:

    我已经解决了这个问题。我了解了 stx:groupstx: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>
    

    【讨论】:

    • 感谢您分享您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多