我有一个PHP脚本,它执行一个返回XML文件的Web服务调用。这部分过程按预期工作。脚本中的后续步骤调用XSLT文件并尝试将XML转换为HTML。
XSLT文件似乎加载正常,但它无法匹配XML文件中的标记,因此不会显示XML文件中的值。 XML文件中的层次结构非常简单。
以下是存储在PHP变量中的XML文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2017-03-08">
<Record userId="1600263" username="ppurfiel" termId="1484" dmd:surveyId="13740910">
<dmd:IndexEntry indexKey="COLLEGE" entryKey="Academic Affairs" text="Academic Affairs"/>
<PCI id="87603417088" dmd:lastModified="2017-02-13T16:30:56">
<PREFIX>Mr.</PREFIX>
<FNAME>Patrick</FNAME>
<PFNAME/>
<MNAME>John</MNAME>
.
.
.
</PCI>
</Record>
</Data>
这是我正在使用的XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="*">
<html>
<body bgcolor="lightgreen">
<h1>Digital Measures PCI Screen Info:</h1>
<B>Prefix: </B>
<xsl:value-of select="/Data/Record/PCI/PREFIX"/>
<br />
<B>First Name: </B>
<xsl:value-of select="/Data/Record/PCI/FNAME"/>
<br />
<B>Preferred First Name: </B>
<xsl:value-of select="/Data/Record/PCI/FNAME"/>
<br />
<B>Middle Name: </B>
<xsl:value-of select="/Data/Record/PCI/MNAME"/>
<br />
.
.
.
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我看到的输出显示了标题
数字测量PCI屏幕信息:
以及数据项标签,例如“前缀:”和“名字:”,但不显示实际值。
我尝试通过搜索“web-services,xml,xslt,tag”找到帮助,但没有找到任何有用的结果。
我的XML包含标记<Data>
和<Record>
。这是我尝试过的第一个在XML中返回这些标记的Web服务。这些标签可能会出现问题吗?
我在我的XSLT文件中尝试了以下两种方法,但没有任何区别:
<xsl:template match="*">
<xsl:template match="/">
非常感谢任何和所有帮助。
答案 0 :(得分:0)
您的问题是由命名空间问题引起的
在XML文件中,将默认命名空间设置为xmlns="http://www.digitalmeasures.com/schema/data"
,
但是在你的XSLT中你根本就没有设置它 - 所以它将是xmlns=""
并且模板的匹配规则将不匹配。
解决方案是将命名空间添加到您的XSLT <xsl:stylesheet>
根元素,以便它们可用于您的<xsl:template...>
规则(顺便提一下,我稍微改进了模板规则):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dta="http://www.digitalmeasures.com/schema/data"
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
exclude-result-prefixes="dta dmd">
<xsl:output method="html" />
<xsl:template match="node()|@*"> <!-- identity template -->
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Data"> <!-- matches /Data root element -->
<html>
<body bgcolor="lightgreen">
<xsl:apply-templates select="node()|@*" />
</body>
</html>
</xsl:template>
<xsl:template match="Record/PCI"> <!-- matches sub-elements -->
<h1>Digital Measures PCI Screen Info:</h1>
<B>Prefix: </B><xsl:value-of select="PREFIX"/><br />
<B>Prefix: </B><xsl:value-of select="PREFIX"/><br />
<B>First Name: </B><xsl:value-of select="FNAME"/><br />
<B>Preferred First Name: </B><xsl:value-of select="FNAME"/><br />
<B>Middle Name: </B><xsl:value-of select="MNAME"/><br />
</xsl:template>
</xsl:stylesheet>
这个XSLT的结果是:
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2017-03-08">
<Record userId="1600263" username="ppurfiel" termId="1484" dmd:surveyId="13740910">
<dmd:IndexEntry indexKey="COLLEGE" entryKey="Academic Affairs" text="Academic Affairs"></dmd:IndexEntry>
<PCI id="87603417088" dmd:lastModified="2017-02-13T16:30:56">
<PREFIX>Mr.</PREFIX>
<FNAME>Patrick</FNAME>
<PFNAME></PFNAME>
<MNAME>John</MNAME>
.
.
.
</PCI>
</Record>
</Data>
上述XSL模板应该适用于您的PHP环境。
答案 1 :(得分:0)
以下是我的问题/问题的解决方案。感谢所有回复的人。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dta="http://www.digitalmeasures.com/schema/data"
xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata"
exclude-result-prefixes="dta dmd">
<xsl:output method="html" />
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
<xsl:template match="dta:Data">
<html>
<body bgcolor="lightgreen">
<xsl:apply-templates select="dta:Record/dta:PCI" />
<h1>Presentations:</h1>
<xsl:apply-templates select="dta:Record/dta:PRESENT[position()<=5]" />
</body>
</html>
</xsl:template>
<xsl:template match="dta:PCI">
<h1>Digital Measures PCI Screen Info:</h1>
<B>Employee Name: </B><xsl:value-of select="dta:PREFIX"/> <xsl:text> </xsl:text> <xsl:value-of select="dta:FNAME"/><xsl:text> </xsl:text> <xsl:value-of select="dta:LNAME"/><xsl:text> </xsl:text> <xsl:value-of select="dta:SUFFIX"/> <br />
</xsl:template>
<xsl:template match="dta:PRESENT">
<B>Presentation Name: </B> <xsl:value-of select="dta:NAME"/><br />
</xsl:template>
</xsl:stylesheet>