“xmlns”属性使我的XSLT返回空值

时间:2009-03-17 14:50:07

标签: xml xslt xslt-1.0

我有一个XML文件,我试图通过XSL文件进行转换。一旦我将非空白xmlns属性添加到我的XSL的根元素,转换就会给我带回所有内容的空白数据。如果我删除或删除xmlns属性,我会得到我期望的结果。

任何人都可以告诉我为什么会这样,所以我可以阻止它!

这是我的一些XSL(省略了一些部分并用...替换):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ... >

  <xsl:import href="html_commonstructures.xsl"/>
  <xsl:output method="html"/>

  <xsl:template match="/">
    <div>
    <xsl:call-template name="ServiceStructure">
      <xsl:with-param name="structure" select="ServiceDescription" />
    </xsl:call-template>
    </div>
  </xsl:template>

  <xsl:template name="ServiceStructure">
    <xsl:param name="structure"/>
    <h3>
      <xsl:value-of select="$structure/DC.Title" /> (<xsl:value-of select="$structure/DC.Identifier" />)
    </h3>
    <!-- And so on -->
  </xsl:template>
</xsl:stylesheet>

*编辑* 这是html_commonstructures中的内容片段:

<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rxr="http://ilrt.org/discovery/2004/03/rxr/" xmlns:esd="http://www.esd.org.uk/standards"
    xmlns:core="http://www.govtalk.gov.uk/core" xmlns:n2="http://www.govtalk.gov.uk/metadata/egms"
    xmlns:apd="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails"
    xmlns:con="http://www.govtalk.gov.uk/people/ContactTypes"
    xmlns:bs7666="http://www.govtalk.gov.uk/people/bs7666">

  <!-- A template for the ControlledListStructures -->
  <xsl:template name="ControlledListStructure">
    <xsl:param name="structure"/>

    <p class="controlledlist">
      <xsl:value-of select="$structure/text()" />
      <xsl:if test="$structure/@Id | $structure/@ConceptId | $structure/@ItemName | $structure/@ListName">
        <span class="metainfo">[
          <xsl:if test="$structure/@Id">
            ID: <xsl:value-of select="$structure/@Id" />;
          </xsl:if>
          <xsl:if test="$structure/@ConceptId">
            Concept ID: <xsl:value-of select="$structure/@ConceptId" />;
          </xsl:if> 
          <xsl:if test="$structure/@ItemName">
            Item Name: <xsl:value-of select="$structure/@ItemName" />;
          </xsl:if>
          <xsl:if test="$structure/@ListName">
            List Name: <xsl:value-of select="$structure/@ListName" />
          </xsl:if>
          ]
        </span>
      </xsl:if>
    </p>
  </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:4)

为什么首先添加xmlns命名空间定义?

通过添加xmlns属性,您可以更改XSLT的默认命名空间。您必须调整所有表达式以使用输入文档的命名空间,即使用自由前缀添加输入文档的命名空间定义并替换例如带有'myPrefix:SerciveDescription'的表达式'ServiceDesription'。

答案 1 :(得分:2)

如果XML文档上有命名空间,则需要在XSLT上具有相同的命名空间。