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