使用xslt将xml中的标记名称更改为另一个xml中的值

时间:2014-07-15 15:30:58

标签: xml xslt transform

请查看我的源XML,我想使用XSLT将其转换为目标XML。但是我没有成功,请帮助提供有效的XSLT。

源XML:

<Details>
   <ID>1</ID>
   <CUDF1>XYZ</CUDF1>
   <Type>B</Type>
   <Style>S</Style>
   <BOM>B1</BOM>
</Details>

目标XML:

<Table>
  <Row>
    <ID>1</ID>
    <Name>CUDF1</Name>
    <Value>XYZ</Value>
  </Row>
  <Row>
    <ID>1</ID>
    <Name>Type</Name>
    <Value>B</Value>
  </Row>
  <Row>
    <ID>1</ID>
    <Name>Style</Name>
    <Value>S</Value>
  </Row>
  <Row>
    <ID>1</ID>
    <Name>BOM</Name>
    <Value>B1</Value>
  </Row>
</Table>

这是我的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <Table>
       <xsl:for-each select="child::node()"> 
        <xsl:element name="Row">
          <xsl:copy-of select="ID"></xsl:copy-of>
          <xsl:element name="Name">
            <xsl:value-of select="name(.)"/>
          </xsl:element>
          <xsl:element name="Value">
            <xsl:value-of select="/@Name"/>
          </xsl:element>
        </xsl:element>
        </xsl:for-each>
      </Table>
    </xsl:template>
</xsl:stylesheet>

当我将此XSLT链接到示例XML时,我的浏览器(IE)中没有任何内容。我究竟做错了什么 ?有没有办法在IE或任何其他浏览器中调试它?

先谢谢。

1 个答案:

答案 0 :(得分:0)

样式表的主要问题 - 除了不必要的冗长之外 - 是 context 。您的模板与"/"匹配,因此您位于根节点的上下文中。在这方面:

<xsl:copy-of select="ID"></xsl:copy-of>

不返回任何内容,因为ID不是根节点的子节点。你需要使用:

<xsl:copy-of select="Details/ID"></xsl:copy-of>

,等等您要复制的其他节点。


编辑:

  

所以我不想将我的XSLT与详细信息下的标记名称绑定   除了ID

没关系,但你仍然需要尊重你的背景,所以不要:

 <xsl:for-each select="child::node()"> 

你应该:

 <xsl:for-each select="Details/*"> 

然后:

<xsl:element name="Row">
    <xsl:copy-of select="../ID"></xsl:copy-of>
    <xsl:element name="Name">
        <xsl:value-of select="name(.)"/>
    </xsl:element>
    <xsl:element name="Value">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:element>

或者,如果你想让它更短,只需:

<Row>
    <xsl:copy-of select="../ID"/>
    <Name><xsl:value-of select="local-name()"/></Name>
    <Value><xsl:value-of select="."/></Value>
</Row>