Web服务XML <data> <record>标记

时间:2017-03-08 20:17:08

标签: xml web-services xslt

我有一个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="/">

非常感谢任何和所有帮助。

2 个答案:

答案 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()&lt;=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>