1

我有一个这种格式的 xml 文档。

<SampleXMLFormat>
<Header>
<Id>123</Id>
</header>
<Properties>
<property name= "type" value = "a1">
<property name="prop1" value="val1"/>
<property name="prop2" value="val2"/>
</Properties>
<Properties>
<property name= "type" value = "a2">
<property name="prop1" value="val1"/>
<property name="prop2" value="val2"/>
</Properties>
</SampleXMLFormat>

我无法编写将我的 xml 文档转换为类似的 xslt 转换

<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
</Properties>
</SampleXMLFormat>

请问我可以得到一些帮助吗?

4

2 回答 2

2

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <SampleXMLFormat>
    <xsl:copy-of select="Header"/>
    <Properties>
     <xsl:apply-templates/>
    </Properties>
  </SampleXMLFormat>
 </xsl:template>

 <xsl:template match="property[not(@name='type')]">
  <property name="{../property[@name='type']/@value}_{@name}" value="{@value}"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<SampleXMLFormat>
  <Header>
    <Id>123</Id>
  </Header>
  <Properties>
    <property name= "type" value = "a1"/>
    <property name="prop1" value="val1"/>
    <property name="prop2" value="val2"/>
  </Properties>
  <Properties>
    <property name= "type" value = "a2"/>
    <property name="prop1" value="val1"/>
    <property name="prop2" value="val2"/>
  </Properties>
</SampleXMLFormat>

产生想要的正确结果:

<SampleXMLFormat>
   <Header>
      <Id>123</Id>
   </Header>
   <Properties>
      <property name="a1_prop1" value="val1"/>
      <property name="a1_prop2" value="val2"/>
      <property name="a2_prop1" value="val1"/>
      <property name="a2_prop2" value="val2"/>
   </Properties>
</SampleXMLFormat>

说明

正确使用:

  1. 模板匹配模式

  2. AVT(属性值模板)。

于 2013-04-25T02:25:48.173 回答
1

您的 XML 格式不正确,但假设这是您的意思(请注意终止的“类型”属性):

<SampleXMLFormat>
  <Properties>
    <property name= "type" value = "a1"/>
    <property name="prop1" value="val1"/>
    <property name="prop2" value="val2"/>
  </Properties>
  <Properties>
    <property name= "type" value = "a2"/>
    <property name="prop1" value="val1"/>
    <property name="prop2" value="val2"/>
  </Properties>
</SampleXMLFormat>

那么这个 XSLT 应该可以解决问题:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <xsl:copy>
      <Properties>
        <xsl:apply-templates
          select="Properties/*[not(self::property and 
                                   @name = 'type')]" />
      </Properties>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="property/@name">
    <xsl:attribute name="name">
      <xsl:value-of 
        select="concat(../../property[@name = 'type']/@value, '_', .)"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

在上述输入上运行时,结果为:

<SampleXMLFormat>
  <Properties>
    <property name="a1_prop1" value="val1" />
    <property name="a1_prop2" value="val2" />
    <property name="a2_prop1" value="val1" />
    <property name="a2_prop2" value="val2" />
  </Properties>
</SampleXMLFormat>
于 2013-04-25T01:26:24.213 回答