1

我的输入 xml 会像这样带有 json 命名空间..

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <json:object name="Login">
        <json:object name="Group">
            <json:object name="TargetSystem">
                <json:string name="Name">john</json:string>
                <json:string name="Password"/>
            </json:object>
        </json:object>
    </json:object>
</json:object>

我需要这样的输出

<Login>
    <Group>
        <TargetSystem>
            <Name>john</Name>
            <Password/>
        </TargetSystem>
    </Group>
</Login>

我必须使用 xslt 输入 xml 中的属性名称值创建此 xml。我正在使用下面的 xslt。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:template match="/">

        <xsl:apply-templates select="json:object/*"/>
    </xsl:template>
    <xsl:template match="json:object">
        <xsl:element name="{@name}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

使用这个我得到的只有约翰。我必须使用一些循环概念..谁能帮我实现这一目标?

4

2 回答 2

1

如果您喜欢最小的 XSLT,那么可以提出一个通用的 XSLT,它可以与任何名称空间一起使用。

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

   <xsl:template match="*[@name]">
      <xsl:element name="{@name}">
       <xsl:apply-templates/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

换句话说,这将匹配任何具有@name属性的元素,并创建一个具有该名称的元素。因为根元素没有这个属性,所以它不会被输出,但是默认的模板匹配会继续处理它的子元素。

于 2012-10-09T11:57:11.937 回答
0

我想你想要

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0"
  xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
  exclude-result-prefixes="json">

<xsl:template match="/json:object">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="json:object[@name]">
  <xsl:element name="{@name}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<xsl:template match="json:string[@name]">
  <xsl:element name="{@name}">
    <xsl:value-of select="."/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>
于 2012-10-09T11:36:32.573 回答