1

我创建了一个小应用程序,用于将系统中的 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>

我的原始 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是整个文件的根

在转换后的 XML 中,测试如下所示:<test />

4

2 回答 2

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>
于 2012-10-11T12:41:49.943 回答
0

要获取节点的值,请使用

  <xsl:template match="//SourceEndpoint">
    <InvoiceAmount>
      <xsl:value-of select="./text()" />
    </InvoiceAmount>
  </xsl:template>
于 2012-10-11T12:12:35.630 回答