Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT实现XML到XML的映射_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

使用XSLT实现XML到XML的映射

使用XSLT实现XML到XML的映射,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我是XSLT新手,尝试使用XSLT将一个XML映射到另一个XML,下面是我的第一个XML <root> <record> <element name="LoginId">a</element> <element name="name">Admin Manager</element> <element name="password">12345</ele

我是XSLT新手,尝试使用XSLT将一个XML映射到另一个XML,下面是我的第一个XML

<root>
    <record>
        <element name="LoginId">a</element>
        <element name="name">Admin Manager</element>
        <element name="password">12345</element>
        <element name="Age">28</element>
        <element name="Sex">M</element>
    </record>
    <record>
        <element name="LoginId">b</element>
        <element name="name">HR exec</element>
        <element name="password">pass1</element>
        <element name="Age">26</element>
        <element name="Sex">F</element>
    </record>
    <record>
        <element name="LoginId">c</element>
        <element name="name">PR Manager</element>
        <element name="password">pass2</element>
        <element name="Age">27</element>
        <element name="Sex">M</element>
    </record>
</root>

A.
行政经理
12345
28
M
B
人力资源主管
通行证1
26
F
C
公关经理
pass2
27
M
我需要将此XML转换为以下内容

<?xml version="1.0" encoding="UTF-8"?>
<final>
    <test>
        <UID>a</UUID>
        <Name>HR manager</Name>
        <Groups>admingroup</Groups>
        <Password>12345</Password>
    </test>
    <test>
        <UID>b</UUID>
        <Name>HR exec</Name>
        <Groups>admingroup</Groups>
        <Password>pass1</Password>
    </test>
    <test>
        <UID>c</UUID>
        <Name>PR manager</Name>
        <Groups>admingroup</Groups>
        <Password>pass2</Password>
    </test>
</final>

A.
人力资源经理
管理组
12345
B
人力资源主管
管理组
通行证1
C
公关经理
管理组
pass2
我尝试使用xslt进行转换

<?xml version="1.0" encoding="UTF-8" ?> 
- <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
- <xsl:template match="/">
- <test>
- <xsl:for-each select="root/record">
  <xsl:apply-templates select="element" /> 
  </xsl:for-each>
  </test>
  </xsl:template>
- <xsl:template match="element">
- <test>
  <Employee /> 
- <UID>
  <xsl:value-of select="@LoginId" /> 
  </UID>
- <xsl:choose>
- <xsl:when test="@name = ''">
- <Name>
  <xsl:text>demo employee</xsl:text> 
  </Name>
  </xsl:when>
- <xsl:otherwise>
- <Name>
  <xsl:value-of select="@name" /> 
  </Name>
  </xsl:otherwise>
  </xsl:choose>
- <Groups>
  <xsl:text>admingroup</xsl:text> 
  </Groups>
- <Password>
  <xsl:value-of select="@password" /> 
  </Password>
  </test>
  </xsl:template>
  </xsl:transform>

- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
演示员工
- 
- 
- 
管理组
- 
但是这个xslt生成了以下XML输出

<?xml version="1.0" encoding="UTF-8"?>
<impex>
    <final>
        <Employee />
        <UID />
        <Name>LoginId</Name>
        <Groups>admingroup</Groups>
        <Password />
    </final>

total 15 <final></final> with similar output

罗吉尼
管理组
共15个,产量相似
我可以用Java轻松地完成这项工作,但在xslt中必须做些什么?我面临的唯一问题是重复使用具有不同属性值的
标记


这方面的任何帮助都会对我有很大帮助

我会这样做:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="root">
    <final>
      <xsl:apply-templates/>
    </final>
  </xsl:template>

  <xsl:template match="record">
    <test>
      <xsl:apply-templates select="element[@name = ('LoginId', 'name')]"/>
      <Groups>admingroup</Groups>
      <xsl:apply-templates select="element[@name = 'password']"/>
    </test>
  </xsl:template>

  <xsl:template match="element[@name = 'LoginId']">
    <UID>
      <xsl:value-of select="."/>
    </UID>
  </xsl:template>

  <xsl:template match="element[@name = 'name']">
    <Name>
      <xsl:value-of select="."/>
    </Name>
  </xsl:template>

  <xsl:template match="element[@name = 'password']">
    <Password>
      <xsl:value-of select="."/>
    </Password>
  </xsl:template>

</xsl:stylesheet>

管理组
通过这种方式,Saxon 9.3从示例输入生成以下结果:

<final>
   <test>
      <UID>a</UID>
      <Name>Admin Manager</Name>
      <Groups>admingroup</Groups>
      <Password>12345</Password>
   </test>
   <test>
      <UID>b</UID>
      <Name>HR exec</Name>
      <Groups>admingroup</Groups>
      <Password>pass1</Password>
   </test>
   <test>
      <UID>c</UID>
      <Name>PR Manager</Name>
      <Groups>admingroup</Groups>
      <Password>pass2</Password>
   </test>
</final>

A.
行政经理
管理组
12345
B
人力资源主管
管理组
通行证1
C
公关经理
管理组
pass2

即使你已经有了@Martin的答案(+1)所提出的优秀解决方案,我也在这里修正你的转换,向你展示你错在哪里。这可能有助于您进一步了解XSLT(和XPath)的工作原理


使用源架构到具有转换映射的目标架构。为了表示数据,XSLT更适合将XML转换为其他格式


签出BizTalk

不客气。确保接受最适合你问题的答案。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <final>
                <xsl:apply-templates select="root/record" /> 
        </final>
    </xsl:template>

    <xsl:template match="record">
        <test>
            <Employee /> 
            <UID>
                <xsl:value-of select="element[@name='LoginId']" /> 
            </UID>
            <xsl:choose>
                <xsl:when test="element[@name='name']=''">
                    <Name>
                        <xsl:text>demo employee</xsl:text> 
                    </Name>
                </xsl:when>
                <xsl:otherwise>
                    <Name>
                        <xsl:value-of select="element[@name='name']"/> 
                    </Name>
                </xsl:otherwise>
            </xsl:choose>
            <Groups>
                <xsl:text>admingroup</xsl:text> 
            </Groups>
            <Password>
                <xsl:value-of select="element[@name='password']" /> 
            </Password>
        </test>
    </xsl:template>

</xsl:transform>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <final>
            <xsl:apply-templates select="root/record" /> 
        </final>
    </xsl:template>

    <xsl:template match="record">
        <test>
            <Employee /> 
            <UID>
                <xsl:value-of select="element[@name='LoginId']" /> 
            </UID>
            <Name>
                <xsl:apply-templates select="element[@name='name']"/>
            </Name>
            <Groups>
                <xsl:text>admingroup</xsl:text> 
            </Groups>
            <Password>
                <xsl:value-of select="element[@name='password']" /> 
            </Password>
        </test>
    </xsl:template>

    <xsl:template match="element[@name='name'][.='']">
            <xsl:text>demo employee</xsl:text> 
    </xsl:template>

    <xsl:template match="element[@name='name'][.!='']">
            <xsl:value-of select="."/> 
    </xsl:template>

</xsl:transform>