使用XSLT将XML问题转换为XML

时间:2017-11-08 19:18:19

标签: xml xslt

我正在使用XSLT通过删除一些节点来执行XML到XML。我是XSLt的新手,这让人感到困惑。

XML输入,

<?xml version="1.0" encoding="UTF-8"?>
    <role>
       <status>success</status>
       <data>
          <name>ac1</name>
       </data>
       <data>
          <name>ac2</name>
       </data>
       <data>
          <name>ac3</name>
       </data>
       <day>monday</day>
    </role>

XSLT是,

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" encoding="utf-8" indent="yes" />
   <xsl:template match="role">
      <xsl:copy>
         <xsl:for-each select="data">
            <disaply_name>
               <xsl:value-of select="name" />
            </disaply_name>
         </xsl:for-each>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

输出是,

<?xml version="1.0" encoding="utf-8"?>
<role>
  <disaply_name>ac1</disaply_name>
  <disaply_name>ac2</disaply_name>
  <disaply_name>ac3</disaply_name>
</role>

预期输出是,

<?xml version="1.0" encoding="utf-8"?>
<root>
<role2>
  <disaply_name>ac1</disaply_name>
</role2>
<role2>
  <disaply_name>ac2</disaply_name>
</role2>
<role2>
  <disaply_name>ac3</disaply_name>
</role2>
</root>

我应该修改什么? .......................

1 个答案:

答案 0 :(得分:1)

您对<xsl:copy>的使用意味着它正在复制当前节点,在本例中为<role>,这解释了它在输出中的外观。由于之前没有指定其他节点,因此XSLT将其视为根节点。所以我刚删除它,并正确放置了节点<root><role2>

要获得预期的输出,请尝试使用以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="utf-8" indent="yes" />
    <xsl:template match="role">
        <root>
            <xsl:for-each select="data">
                <role2>
                    <display_name>
                        <xsl:value-of select="name" />
                    </display_name>
                </role2>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

这是我得到的输出:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <role2>
    <display_name>ac1</display_name>
  </role2>
  <role2>
    <display_name>ac2</display_name>
  </role2>
  <role2>
    <display_name>ac3</display_name>
  </role2>
</root>