【问题标题】:Parsing XML through XSLT Transforms通过 XSLT 转换解析 XML
【发布时间】:2013-06-16 09:22:50
【问题描述】:

我有一些这种格式的 XML

<items>
    <item>
    <float>0.75</float>
    <string>NAME</string>
    <string>Bob</string>
    <string>CREATION_TIME</string>
    <timestamp>2012-11-01 00:03:08</timestamp>
    <string>OCCUPATION</string>
    <null />
    </item>
</items>

我想把它转换成这样的格式

<item>
    <NAME>Bob</NAME>
    <CREATION_TIME>2012-11-01 00:03:08</CREATION_TIME>
    <OCCUPATION></OCCUPATION>
</item>

是否可以通过普通的 XSLT 转换来实现,还是我必须编写自己的解析器?

【问题讨论】:

  • 您能解释一下您想要处理item 元素的哪些子元素以及您想要关联哪些子元素吗?为什么float被忽略了,应该配对哪些元素来创建&lt;some-name&gt;some value&lt;/some-name&gt;结果元素?

标签: xml parsing xslt xml-parsing


【解决方案1】:
<xsl:template match="item">
  <xsl:copy>
    <xsl:apply-templates select="string[position() mod 2 = 1]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="string">
  <xsl:element name="{.}">
    <xsl:value-of select="following-sibling::*[1]"/>
  </xsl:element>
</xsl:template>

【讨论】:

  • +1 - 一个快速的项目:您的解决方案完全删除了 &lt;OCCUPATION&gt; 元素,而 OP 的预期解决方案保留了它。
  • @ABach,你说得对,我目前不确定是什么决定了要处理和关联的元素。我会问海报的。
  • @MartinHonnen 如果对所有字符串进行编号,奇数是键,偶数是值。
  • @Narabhut,&lt;xsl:apply-templates select="string[position() mod 2 = 1]"/&gt; 采用奇数的string 元素,但这样&lt;string&gt;OCCUPATION&lt;/string&gt; 不会被视为键(因为它是第四个string)。这就是你想要的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多