使用XSLT将XML格式转换为另一种XML格式

时间:2014-04-29 11:17:46

标签: xml xslt xslt-1.0

我是XSLT的新手,我需要将输入xml更改为输出xml

输入

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ad:AcceptDataInfo xmlns:ad="http://www.abc.com">
<ad:Product>ABC</ad:SubType>
<ad:AccountNo>123</ad:AccountNo>
<ad:Date>20140429</ad:Date>
<ad:Time>160102</ad:Time>
</ad:AcceptDataInfo>

预期输出

<Documents>
<Document>
<Prop>
  <Name>Product</Name>
  <Value>ABC</Value>
</Prop>
<Prop>
  <Name>AccountNo</Name>
  <Value>123</Value>
</Prop>
<Prop>
  <Name>Date</Name>
  <Value>20140429</Value>
</Prop>
<Prop>
  <Name>Time</Name>
  <Value>160102</Value>
</Prop>
</Document>
</Documents>

我的xslt(不完整)

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

  <xsl:template match="*">
    <xsl:element name="{local-name(.)}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:attribute name="{local-name(.)}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

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

</xsl:stylesheet>

我在网上搜索过,只能删除名称空间前缀,并添加一些标记,提前谢谢!

2 个答案:

答案 0 :(得分:1)

很难根据一个例子确定转换的逻辑。我猜你想要这样的东西:

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

<xsl:template match="/*">
    <Documents>
        <Document>
            <xsl:apply-templates select="*"/>
        </Document>
    </Documents>
</xsl:template>

<xsl:template match="*">
    <Prop>
      <Name><xsl:value-of select="local-name()"/></Name>
      <Value><xsl:value-of select="."/></Value>
    </Prop>
</xsl:template>

</xsl:stylesheet>

当上述内容适用于:(更正!)输入时:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ad:AcceptDataInfo xmlns:ad="http://www.abc.com">
    <ad:Product>ABC</ad:Product>
    <ad:AccountNo>123</ad:AccountNo>
    <ad:Date>20140429</ad:Date>
    <ad:Time>160102</ad:Time>
</ad:AcceptDataInfo>

产生以下结果:

<?xml version="1.0" encoding="UTF-8"?>
<Documents>
   <Document>
      <Prop>
         <Name>Product</Name>
         <Value>ABC</Value>
      </Prop>
      <Prop>
         <Name>AccountNo</Name>
         <Value>123</Value>
      </Prop>
      <Prop>
         <Name>Date</Name>
         <Value>20140429</Value>
      </Prop>
      <Prop>
         <Name>Time</Name>
         <Value>160102</Value>
      </Prop>
   </Document>
</Documents>

请注意,这假设事先几乎不知道源XML,除了它具有两级结构(根元素和根元素的子元素)。否则,我们可以使转换不那么通用,从而提高效率。

答案 1 :(得分:0)

这里有很多问题:

  • 您的样式表并未在任何地方声明<Prop>, <Name><Value>个元素;
  • 您使用value-of的唯一位置是属性匹配模板 - 获取您需要在元素匹配模板中执行此操作的任何元素值,或者选择格式{中的节点{1}}

如果您在样式表中注释了您希望它执行的操作,那将会很有帮助,以便找出您的理解存在缺陷的地方。 XSLT问题通常归结为“您的期望是什么?”#39;这通常不会从阅读(错误的)样式表中看出来。