2013-05-09 119 views
0

我在从父标签及其孩子获取所有属性时遇到了一些麻烦。 这是我的XML:xsl - 获取孩子的所有属性

<macro name="editor"> 
     <names variable="editor" delimiter=", "> 
      <name and="symbol" delimiter=", "/> 
      <label form="short" prefix=" (" text-case="lowercase" suffix=".)" /> 
     </names> 
</macro> 

我希望能够从的childNodes得到所有的属性。 我目前有:

<xsl:for-each select="macro"> 
    <xsl:value-of select="@*" /> 
    <br /> 
</xsl:for-each> 

我多么希望它变成:

编辑

名编辑,

名称符号,

标签短(小写。 )

回答

1

当这个XSLT转换

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

<xsl:template match="macro"> 
    <xsl:value-of select="@name"/> 
    <xsl:for-each select="child::*"> 
    <xsl:text disable-output-escaping="yes">&#10;</xsl:text> 
    <xsl:value-of select="name(.)"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="@*" separator=""/> 

    <xsl:for-each select="child::*"> 
     <xsl:text disable-output-escaping="yes">&#10;</xsl:text> 
     <xsl:value-of select="name(.)"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="@*" separator=""/> 
    </xsl:for-each> 

    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

下面XML运行:

<macro name="editor"> 
     <names variable="editor" delimiter=", "> 
      <name and="symbol" delimiter=", "/> 
      <label form="short" prefix=" (" text-case="lowercase" suffix=".)" /> 
     </names> 
</macro> 

给出所需的输出:

editor 
names editor, 
name symbol, 
label short (lowercase.) 
+0

嘿,这一切看起来不错。但是,有一个问题,“child :: *”究竟做了什么?永远不要使用它。我目前得到以下内容:“编辑名称编辑器名称符号标签短” – 2013-05-09 13:00:51

+0

@ErikÅstrand:child :: *将匹配当前节点的任何子元素。 – siva2012 2013-05-09 13:08:30

+0

@ErikÅstrand:如果这是正确的答案,请您将其标记为正确答案。 – siva2012 2013-05-09 13:09:24

1

试试这个让所有varibale名称和值:

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

    <xsl:output indent="yes"/> 
    <xsl:template match="macro"> 
    <xsl:for-each select="child::*//@*"> 
     <xsl:value-of select="concat(name(), ' : ', .)"/> 
     <xsl:text> 
    </xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

输出:

variable : editor 
    delimiter : , 
    and : symbol 
    delimiter : , 
    form : short 
    prefix : (
    text-case : lowercase 
    suffix : .) 
1

试试这个:

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

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*" mode="print_attr"> 
     <xsl:value-of select="."/> 
    </xsl:template> 
    <xsl:template match="node()" mode="print_attr"> 
     <xsl:text>&#10;</xsl:text> 
     <br/> 
     <xsl:value-of select="name()"/> 
     <xsl:text> </xsl:text> 
     <xsl:apply-templates mode="print_attr" select="@*|*" /> 
    </xsl:template> 

    <xsl:template match="macro"> 
     <xsl:apply-templates mode="print_attr" select="@*|*"/> 
    </xsl:template> 

</xsl:stylesheet> 

将产生这样的输出:

editor 
<br/>names editor, 
<br/>name symbol, 
<br/>label short (lowercase.)