在XSLT中获取带前缀的XML标记的值

时间:2017-07-10 05:46:31

标签: xml xslt xpath xml-namespaces

我试图在XSLT中获取带前缀的XML标记数据的值。

示例XML:

    <?xml version="1.0" encoding="utf-8"?>
<emp xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://www.w3.org/1999/XSL/dataservices/metadata" xmlns:d="http://www.w3.org/1999/XSL/dataservices">
    <record>
        <info type="application/xml">
            <m:employee>
                <d:name>11278</d:name>
            </m:employee>
        </info>
    </record>
</emp>

我想使用XSLT获取name元素的数据。我尝试了不同的选择。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:m="http://www.w3.org/1999/XSL/dataservices/metadata" 
        xmlns:d="http://www.w3.org/1999/XSL/dataservices">
    <xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>
    <xsl:template match="/">
      <html>
          <body>
            <h2><i>Emp Compensastion Data</i></h2>
            <div class="content-holder">
                <div>Name of the employee: <xsl:value-of select="emp/record/info/m:employee/d:name"/></div>
                <div>Name of the Employee: <xsl:value-of select="//*[local-name()='m:employee']/*[local-name()='d:name']"/></div>
                <div>Name of the Employee: <xsl:value-of select="//*[name()='m:employee']/*[name()='d:name']"/></div>
            </div>
          </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>

我是XSL转换的新手。请帮忙。

注意:我尝试使用XSL转换创建HTML。

2 个答案:

答案 0 :(得分:2)

<xsl:value-of select="emp/record/info/m:employee/d:name"/>

这是你最好的尝试。它不起作用的原因是您的XML定义了默认命名空间xmlns="http://www.w3.org/2005/Atom",所有未加前缀的元素 - 例如emprecordinfo - 都是在这个命名空间中。

您必须在样式表中声明此命名空间,为其指定前缀,并在处理源XML中未加前缀的元素时使用该前缀:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://www.w3.org/2005/Atom"
xmlns:m="http://www.w3.org/1999/XSL/dataservices/metadata" 
xmlns:d="http://www.w3.org/1999/XSL/dataservices"
exclude-result-prefixes="a m d">
<xsl:output method='html' encoding='UTF-8'/>

<xsl:template match="/">
    <html>
        <body>
            <h2><i>Emp Compensastion Data</i></h2>
            <div class="content-holder">
                <div>Name of the employee: <xsl:value-of select="/a:emp/a:record/a:info/m:employee/d:name"/></div>
            </div>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

注意
你永远不应该使用像*[local-name()='m:employee']这样的黑客。但是你也应该知道元素的本地名称会排除前缀 - 因此谓词永远不会为真。

答案 1 :(得分:2)

如果我理解正确,你正在尝试三种不同的xpath来获取值,但没有任何作用。是这样吗?

        <div class="content-holder">
            <div>Name of the employee: <xsl:value-of select="emp/record/info/m:employee/d:name"/></div>
            <div>Name of the Employee: <xsl:value-of select="//*[local-name()='m:employee']/*[local-name()='d:name']"/></div>
            <div>Name of the Employee: <xsl:value-of select="//*[name()='m:employee']/*[name()='d:name']"/></div>
        </div>

但是,我尝试了转换并获得了以下结果:

<?xml version = '1.0' encoding = 'UTF-8'?>
<html xmlns:d="http://www.w3.org/1999/XSL/dataservices" xmlns:m="http://www.w3.org/1999/XSL/dataservices/metadata" xmlns:ns0="http://www.w3.org/2005/Atom">
   <body>
      <h2><i>Emp Compensastion Data</i>
      </h2>
      <div class="content-holder">
         <div>Name of the employee:</div>
         <div>Name of the Employee:</div>
         <div>Name of the Employee:11278</div>
      </div>
   </body>
</html>

所以,我可以断言第三个xpath正在运行。

第一个xpath不起作用,因为还有另一个问题:emp元素位于由xmlns="http://www.w3.org/2005/Atom"定义的命名空间中 这需要考虑,例如,我已将xmlns:ns0="http://www.w3.org/2005/Atom"添加到我的样式表属性中:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://www.w3.org/2005/Atom"
                xmlns:m="http://www.w3.org/1999/XSL/dataservices/metadata" xmlns:d="http://www.w3.org/1999/XSL/dataservices">

现在我得到了以下第一个xpath。它也有效:

<div>Name of the employee:<xsl:value-of select="ns0:emp/ns0:record/ns0:info/m:employee/d:name"/></div>