Xml XSLT-未设置根元素

Xml XSLT-未设置根元素,xml,xslt,Xml,Xslt,在我的XSLT上获取根元素未设置错误 XML输入: <?xml version="1.0" encoding="utf-8"?> <Customer count="1"> <Record id="123"> <Data id="123-00">John Smith</Data> </Record> <Record id="456"> <Data id="123-00">M

在我的XSLT上获取根元素未设置错误

XML输入:

<?xml version="1.0" encoding="utf-8"?>
<Customer count="1">
  <Record id="123">
    <Data id="123-00">John Smith</Data>
  </Record>
   <Record id="456">
    <Data id="123-00">Mark Doe</Data>
  </Record>
 </Customer>

约翰·史密斯
马克·多伊
期望输出:

<Customer>
    <Record>
        <Name>John Smith<Name>
    </Record>
    <Record>
        <Name>Mark Doe</Name>
    </Record>
</Customer>

约翰·史密斯
马克·多伊
到目前为止我所拥有的:

<xsl:template match="/Customer/Record">
    <xsl:for-each select="Data">
    <Customer>
        <Record>        
            <Name><xsl:value-of select="@id='123-00'"/></Name>
        </Record>
    </Customer>
    </xsl:for-each>
</xsl:template>


我尝试在没有for循环代码的情况下使用
template match=“/”
和select=“Customer/Record/Name[@id='123-00']”的
值,它可以工作。但是我知道这不是编码它的最佳方式。

如果要将
数据
元素转换为
名称
元素并删除任何属性,请使用

<xsl:template match="Data">
  <Name>
    <xsl:value-of select="."/>
  </Name>
</xsl:template>

对于其他元素,您似乎希望复制它们,而不复制它们的属性,因此添加一个模板

<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>


足够了:

如果要将
数据
元素转换为
名称
元素并删除任何属性,请使用

<xsl:template match="Data">
  <Name>
    <xsl:value-of select="."/>
  </Name>
</xsl:template>

对于其他元素,您似乎希望复制它们,而不复制它们的属性,因此添加一个模板

<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>


足够了:

要使代码产生所需的输出,您需要:

  • 使您的模板与客户匹配,而不是与记录匹配
  • Customer
    元素移到
    xsl:for-each
    指令之外
  • 获取
    数据
    节点的实际值(现在只有布尔测试):

  • 要使代码产生所需的输出,您需要:

  • 使您的模板与客户匹配,而不是与记录匹配
  • Customer
    元素移到
    xsl:for-each
    指令之外
  • 获取
    数据
    节点的实际值(现在只有布尔测试):
  • 
    
    成功了!谢谢我不知道从哪里开始for循环。它成功了!谢谢我不知道从哪里开始for循环。当我尝试template match=“Data”时,我仍然得到一个根元素not set错误。然后我使用了template match=“/Customer”。当我尝试template match=“Data”时,我仍然得到一个根元素not set错误。然后我使用模板匹配=“/Customer”。