使用XSLT转换时,无法从我的XML文件中获取值

时间:2012-10-11 12:07:21

标签: xml xslt xpath

我创建了一个小应用程序,用于将我从系统中获取的XML转换为使用XSLT的客户所需的新XML格式。问题是,我似乎无法检索XML节点的值,它们只是空的。

这是我的XSLT文件:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <test>
      <xsl:apply-templates select="SourceEndpoint" />
    </test>
  </xsl:template>

  <xsl:template match="SourceEndpoint">
    <InvoiceAmount>
      <xsl:value-of select="." />
    </InvoiceAmount>
  </xsl:template>
</xsl:stylesheet>

My Original XML确实有一个名为SourceEndpoint的节点,所以我不确定我在这里做错了什么?

我也试过:<xsl:value-of select="Envelope/Header/SourceEndpoint" />而不是模板,但我得到了相同的结果

修改

以下是我的原始XML片段:

<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
  <Header>
    <MessageId>{11EA62F5-543A-4483-B216-91E526AE2319}</MessageId> 
    <SourceEndpoint>Test</SourceEndpoint> 
    <DestinationEndpoint>TestInvoice</DestinationEndpoint> 
  </Header>
</Envelope>

Envelope是整个文件的根

在Transformed XML中,测试类似于:<test />

2 个答案:

答案 0 :(得分:2)

XML文件位于默认命名空间中 - 不在“null”命名空间中。这会带来巨大的差异

搜索XPath和默认命名空间,你会找到很多好的答案。

实质上,您必须在XSLT转换中定义相同的名称空间,并将前缀(例如“x”)与其相关联。

然后在任何XPath表达式中(匹配模式是一种XPath表达式)使用x:someName而不是someName

提供的代码的另一个问题是它尝试访问元素SourceEndpoint作为文档的顶部元素 - 并且在这种情况下的顶部元素具有不同的名称

纠正这两个问题,我们进行了以下转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://schemas.microsoft.com/dynamics/2008/01/documents/Message"
 exclude-result-prefixes="x">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <test>
            <xsl:apply-templates select="/*/*/x:SourceEndpoint" />
        </test>
    </xsl:template>

    <xsl:template match="x:SourceEndpoint">
        <InvoiceAmount>
            <xsl:value-of select="." />
        </InvoiceAmount>
    </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
    <Header>
        <MessageId>{11EA62F5-543A-4483-B216-91E526AE2319}</MessageId>
        <SourceEndpoint>Test</SourceEndpoint>
        <DestinationEndpoint>TestInvoice</DestinationEndpoint>
    </Header>
</Envelope>

产生了想要的正确结果

<?xml version="1.0" encoding="utf-8"?>
<test>
   <InvoiceAmount>Test</InvoiceAmount>
</test>

答案 1 :(得分:0)

要获取节点的值,请使用

  <xsl:template match="//SourceEndpoint">
    <InvoiceAmount>
      <xsl:value-of select="./text()" />
    </InvoiceAmount>
  </xsl:template>