XSLT-未设置根元素

时间:2018-12-01 11:13:30

标签: xml xslt

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

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="/"value-of select="Customer/Record/Name[@id='123-00']"一起使用,它可以工作。但是我知道这不是最好的编码方式。

2 个答案:

答案 0 :(得分:2)

如果要将Data元素转换为Name元素并删除任何属性,请使用

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

对于其他元素,您似乎想复制它们而不包含它们的属性,因此添加模板

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

足够:https://xsltfiddle.liberty-development.net/6qVRKxi

答案 1 :(得分:0)

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

  1. 使模板匹配Customer而不是Record
  2. Customer元素移至xsl:for-each指令的外部
  3. 获取Data节点的实际值(现在只有布尔测试):

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