【问题标题】:Web service XML <Data> <Record> tagWeb 服务 XML <Data> <Record> 标签
【发布时间】:2017-07-29 14:22:10
【问题描述】:

我有一个 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 包含标签 &lt;Data&gt;&lt;Record&gt;。这是我尝试过的第一个在 XML 中返回这些标签的 Web 服务。这些标签会不会造成问题?

我在我的 XSLT 文件中尝试了以下两种方法,但没有任何区别:

<xsl:template match="*">
<xsl:template match="/">

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

【问题讨论】:

  • 如果您认为这是 PHP 问题,请发布您的 PHP 代码。否则,删除标签。

标签: xml web-services xslt


【解决方案1】:

以下是我的问题/疑问的解决方案。感谢所有回复的人。

<?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>

【讨论】:

    【解决方案2】:

    您的问题是由命名空间问题引起的。
    在您的 XML 文件中,您将默认命名空间设置为 xmlns="http://www.digitalmeasures.com/schema/data",
    但是在您的 XSLT 中您根本没有设置它 - 所以它会是 xmlns="" 并且模板的匹配规则将根本不匹配。

    解决方案是将命名空间添加到您的 XSLT &lt;xsl:stylesheet&gt; 根元素中,以便它们可用于您的 &lt;xsl:template...&gt; 规则(顺便说一下,我对模板规则进行了一些改进):

    <?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 环境中工作。

    【讨论】:

    • @PJ_Purf:我不想显得不礼貌,但接受我的回答会强调你的感激之情:-)
    • 我很抱歉。我昨天一次打开的东西太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多