在xslt 1.0文件中使用.xsd文件中的数据

时间:2018-11-29 12:17:33

标签: xml xslt xsd

在我的xsd文件中,我有一个简单的类型,其中包含一个枚举。

<xs:simpleType name="genreTyp">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Sci-Fi"/>
    <xs:enumeration value="Horror"/>
    <xs:enumeration value="Drama"/>
    <xs:enumeration value="Romance"/>
    <xs:enumeration value="Comedy"/>
    <xs:enumeration value="Bollywood"/>
  </xs:restriction>
</xs:simpleType>

看起来像这样。

我正在使用XSLT 1.0,并且想创建一个显示这些不同值的表。如何使用XSLT 1.0访问值?

编辑:我在XSLT上还比较陌生,所以我尝试使用如下路径访问xsd文件:

<xsl:for-each select="document('xsd/attributes.xsd' )/xs:schema/xs:simpleType[@name='genreTyp']/xs:restriction/xs:enumeration">
            <tr>
                <td>
                    <xsl:value-of select="//@value"/>
                </td>
            </tr>
        </xsl:for-each>

2 个答案:

答案 0 :(得分:0)

您接近了-假设未显示给我们的东西(例如名称空间声明)是正确的-但xsl:value-of中以“ //”开头的内容是胡说八道。您要选择相对于上下文节点(在for-each中选择的那个),而不是相对于树的根,因此省略“ //”。

答案 1 :(得分:0)

这可以作为您的起点demo

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  version="1.0">

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="xs:enumeration">
    <tr><td><xsl:value-of select="@value"/></td></tr>
  </xsl:template>

  <xsl:template match="xs:restriction">
      <table><xsl:apply-templates/></table>
  </xsl:template>

  <!-- ignore space only text nodes -->  
  <xsl:template match="text()">
      <xsl:value-of select="normalize-space(.)"/>
  </xsl:template>

</xsl:stylesheet>

导致

<!DOCTYPE HTML>
<table xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <tr>
      <td>Sci-Fi</td>
   </tr>
   <tr>
      <td>Horror</td>
   </tr>
   <tr>
      <td>Drama</td>
   </tr>
   <tr>
      <td>Romance</td>
   </tr>
   <tr>
      <td>Comedy</td>
   </tr>
   <tr>
      <td>Bollywood</td>
   </tr>
</table>