【问题标题】:Changing tag name in a xml to a value in another xml using xslt使用 xslt 将 xml 中的标记名称更改为另一个 xml 中的值
【发布时间】:2014-09-05 21:20:15
【问题描述】:

请查看我的源 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 或任何其他浏览器中进行调试?

提前致谢。

【问题讨论】:

  • 抱歉,这不是 SO 的工作方式。如果您没有努力解决问题,我们将不会为您“提供有效的 XSLT”。 SO 不是代码编写服务。向我们展示您尝试过的方法并解释哪些方法不起作用,然后我们可以为您提供帮助。
  • 嗨,吉姆,感谢您的意见。我不知道。我已经更新了我的问题。请看一下,让我知道。

标签: xml xslt transform


【解决方案1】:

样式表的主要问题——除了不必要的冗长——是上下文。您的模板与"/" 匹配,因此您处于根节点的上下文中。在这种情况下:

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

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

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

对于您要复制的其他节点,依此类推。


编辑:

所以我不想将我的 XSLT 与详细信息下的标记名称绑定 身份证除外

没关系,但你仍然需要尊重你的上下文,所以不要:

 <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>

【讨论】:

  • ID 好,但是在
    根目录下可以有更多标签。所以我不想将我的 XSLT 与 Details 下的标签名称绑定,ID 除外
  • 感谢您的更新,这行得通。但我想在每个 Row 标签上都有 ID 标签。但它只出现了。
  • 我已将它添加为它开始工作的行中的另一个元素。
  • 嗨迈克尔 - 我想改进它以过滤掉一些标签。所以我正在创建一个这样的变量。 并使用 if 条件过滤标签。 filter1, 2 和 3 分别是过滤标签的硬编码值。
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多