我想从下面的XML中获取“LIVE”。我读过类似的帖子并且一直在使用local-name()函数,但无论我使用什么XSLT,我都无法得到它。
<?xml version="1.0"?>
<cns:customer xmlns:cns="https://services.cns.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://services.cns.com docs/xsd/customer.xsd">
<cns:userId>1001</cns:userId>
<cns:status>LIVE</cns:status>
<cns:type wholesale="true" suspended="false">W1</cns:type>
<cns:properties>
<cns:property>
<cns:name>Name</cns:name>
<cns:value>Bob</cns:value>
</cns:property>
</cns:properties>
</cns:customer>
这是我正在使用的XSLT。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="//*[local-name()='status']/text()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
我正在测试使用氧气应用程序。我认为处理器是Saxon 6.5.5。
我得到的输出是:
1001
LIVE
W1
Name
Bob
谢谢, 保罗
答案 0 :(得分:2)
根据您最近对该问题的修改进行回答。
只需使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="//*[local-name()='status']/text()">
value: <xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
1001,W1 ......等与任何模板都不匹配,因此由默认模板处理,只是将其回显到输出中。
现在您还可以使命名空间版本起作用:
<xsl:template match="/c:customer/c:status" xmlns:c="https://services.cns.com">
value: <xsl:apply-templates select="text()"/>
</xsl:template>
答案 1 :(得分:1)
您应该使用XSLT处理器注册命名空间。但是如果你不知道,你应该能够执行以下XPath表达式:
//*[local-name()="status"]/text()