xsl template

时间:2017-08-03 14:20:31

标签: xml xslt

我在xml中的命名空间问题(来自供应商的xml)以及如何在xsl上解决这个问题。

我的xml:

<?xml version="1.0" encoding="utf-8"?>
  <string xmlns="https://www.website.com/getdata/service/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xmlresponse>
      <header>
        <reportinformation>
          <time>27/06/2017 19:42:07</time>
          <reporttype>getcompanyinformation</reporttype>
        </reportinformation>
      </header>
    </xmlresponse>
  </string>

我的xsl是

?xml version="1.0"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:my="https://www.website.com/getdat/service/"> 
<xsl:output indent="yes"  method="xhtml" omit-xml-declaration="yes"/>
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/my:xmlresponse">
<html>
  <head>
    <title>www.website.com GetData XML Stylesheet</title>   
  </head>
  <body>
    <table>
      <tr>
        <td><span style="{$reporttitle}">GetData </span></td>
      </tr>

      <xsl:apply-templates select="my:reportinformation"/>

    </table>
  </body>
</html>
</xsl:template>

<xsl:template match="my:reportinformation">
<tr>
  <td align="left">
    <table style="{$datatable}">
      <tr>
        <td><span style="{$prompt}">Timestamp:</span></td>
        <td><span style="{$data}"><xsl:value-of select="my:time"/></span></td>
      </tr>
      <tr>
        <td><span style="{$prompt}">Report type:</span></td>
        <td><span style="{$data}"><xsl:value-of select="my:reporttype"/></span></td>
      </tr>
    </table>
  </td>
</tr>
</xsl:template>

我的问题是显示模板报告信息中的信息,但不匹配/显示主模板中的信息。

我在xml中表现不佳,前端更多。好朋友要正确改造什么?

我搜索SO和谷歌但仍然或显示主模板或子模板。

2 个答案:

答案 0 :(得分:1)

我可以看到你正确使用前缀my:来在XPath和匹配模式中指定命名空间中的元素。这确实是你需要做的。

但是,您还需要将此前缀链接到您的命名空间,否则此前缀并不意味着什么,实际上无效。

您需要做的就是在XSLT中替换

xmlns="https://www.website.com/getdat/service/"

xmlns:my="https://www.website.com/getdat/service/"

修改以添加其他问题:

您需要适当地匹配并选择您想要操作的元素。

您的第一个模式不应以xmlresponse为目标。它应该针对根目录,可以使用match =&#34; /&#34;简单地达到。使用match =&#34; / my:xmlresponse&#34;只有当xmlresponse是根元素时才会匹配,而不是。

调用apply-templates时,不应指定select。应用模板最终会按照您的意愿获得报告信息。但是,如果您尝试使用select =&#34; my:reportinformation&#34;只有在报告信息是孩子时才会有效。它不是,它是后代。你需要

select=".//my:reportinformation"

或者根本没有指定要应用于儿童的模板的选择,他们自己将存储桶传递给报告信息。

答案 1 :(得分:1)

您有许多语法错误,您应该能够通过比较样式表来检测这些错误:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="https://www.website.com/getdata/service/"
exclude-result-prefixes="my">

<xsl:template match="/my:string">
    <html>
        <head>
            <title>www.website.com GetData XML Stylesheet</title>   
        </head>
        <body>
            <table>
                <tr>
                    <td>
                        <span style="{UNDEFINED_VARIABLE}">GetData </span>
                    </td>
                </tr>
                <xsl:apply-templates select="my:xmlresponse/my:header/my:reportinformation"/>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="my:reportinformation">
    <tr>
        <td align="left">
            <table style="{UNDEFINED_VARIABLE}">
                <tr>
                    <td>
                        <span style="{UNDEFINED_VARIABLE}">Timestamp:</span>
                    </td>
                    <td>
                        <span style="{UNDEFINED_VARIABLE}">
                            <xsl:value-of select="my:time"/>
                        </span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <span style="{UNDEFINED_VARIABLE}">Report type:</span>
                    </td>
                    <td>
                        <span style="{UNDEFINED_VARIABLE}">
                            <xsl:value-of select="my:reporttype"/>
                        </span>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>