2010-02-18 19 views
2

我有以下结构的XML程序获取XML的子节点的名称使用XSL

<Part> 
    <ID>1</ID> 
    <Density>3</Density> 
    <Parameter> 
      <Element>Alloy</Element> 
    </Parameter> 
</Part> 

我想创造出tranforms这个XML这样一个XSL是

ID 1 
Density 3 
Element Alloy 

我如何能做到这一点?有人可以帮助我...

+0

我没有看到这里的XML ... – anthares 2010-02-18 13:12:49

+0

你愿意修复中的示例代码?很高兴看到这些元素。 – 2010-02-18 13:21:21

回答

2

此示例呈现那些没有子元素的元素的名称和文本内容。

输出具有以下特征:

  • 使用本地名称(),以避免输出命名空间前缀,例如用于<xsl:text/>这是“文本”
  • 用途正常化空间()剥离导致&结尾的空白,并且内部空白
  • XSL的紧凑的序列:带状空间忽略空白仅文本节点在输入
  • 结束CRLF线
  • 输出方法是文本

示例代码:

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

    <xsl:output method="text" /> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="*[not(*)]"> 
     <xsl:value-of select="local-name()" /> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="normalize-space(.)" /> 
     <xsl:text>&#10;&#13;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

'0 = count(*)'相当于'not(*)'。只是做' ...可能更简单...'和''作为单独的模板。 – 2010-02-19 10:46:51

3

你不指定你想要的输出类型,但我会猜测HTML,并不是说它重要的可以使用相同的原则。我也猜测Parameter元素可能包含具有不同标签名称的各种元素。

那么,这就是变换: -

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

    <xsl:template match="Part"> 
     <html> 
      <div> 
       <xsl:text>ID </xsl:text> 
       <xsl:value-of select="ID" /> 
      </div> 
      <div> 
       <xsl:text>Density </xsl:text> 
       <xsl:value-of select="Density" /> 
      </div> 
      <xsl:for-each select="Parameter/*"> 
       <div> 
        <xsl:value-of select="name()" /> 
        <xsl:text> </xsl:text> 
        <xsl:value-of select="." /> 
       </div> 
      </xsl:for-each> 
     </html> 
    </xsl:template> 

</xsl:stylesheet> 
1

你需要看名字()函数。

<xsl:value-of select="name()"/> 
2

作为替代拉克兰的代码,你也可以尝试

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

<xsl:template match="text()"> 
    <xsl:if test="normalize-space(.)"> 
    <xsl:value-of select="local-name(parent::*)" /> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="normalize-space(.)" /> 
    <xsl:text> 
</xsl:text> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+1

为什么父母的“for-each”?给定节点只有一个父代。 '父'轴不是一个函数。你可以消除'for-each'并使用'' – 2010-02-21 02:19:36

+0

@Mads:对,对不起。固定。 – 2010-02-22 12:38:42

3

较短的变换,说明这几个方便的技巧种类:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" /> 
<xsl:strip-space elements="*"/>  
<xsl:variable name="newline"><xsl:text> 
</xsl:text></xsl:variable> 

<xsl:template match="text()"> 
    <xsl:value-of select="concat(local-name(..),' ',normalize-space(.),$newline)"/> 
</xsl:template> 

</xsl:stylesheet> 
  • strip-space表示忽略所有仅限空白的节点。
  • 您可以给函数提供参数,例如local-name。
  • 生成文本输出时,像$ newline这样的变量通常很方便。

可选,把下面的转换忽略所有的非叶文本节点:

<xsl:template match="*[*]"><xsl:apply-templates/></xsl:template>