如何在不使用模板的情况下在xslt中获取父节点属性

时间:2012-07-18 16:26:53

标签: xslt

的xml:

<?xml version="1.0"?>
<student_list>
<ID No="A-1">
<name>Jon</name>
<mark>80</mark>
</ID>
<ID No="A-2">
<name>Ray</name>
<mark>81</mark>
</ID>
</student_list>

我的xsl:

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

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

<xsl:template match="//ID">
     ID:string:"
<xsl:value-of select="@No"/>"
          </xsl:template>

    <xsl:template match="name">
      name:string:"<xsl:apply-templates />"
     </xsl:template>

  <xsl:template match="mark">
      mark:string:"<xsl:apply-templates />"
     </xsl:template>

 </xsl:stylesheet>

预期产量: ID:字符串: “A-1” 名称:字符串:“乔恩” 标志:字符串: “80后” ID:字符串: “A-2” 名称:字符串:“雷人” 标记:字符串: “81”

有些人帮助。


感谢您的回复,真的很棒我通过更新上面的代码获得了输出,但是如何在“文本输出”模式中为每一行获取换行符。我尝试使用此代码:

<xsl:template name="Newline"><xsl:text> 
</xsl:text>
</xsl:template>

line--1
 <xsl:call-template name="Newline" /> 
line--2 

但这并没有让我换线。任何信息都会有所帮助。再次感谢。

1 个答案:

答案 0 :(得分:1)

问题是名称标记元素是 ID 元素的子元素,但在您的模板中与匹配ID 您没有任何代码可以继续处理子项,因此它们不匹配。

ID 匹配模板更改为以下内容:

<xsl:template match="//ID"> 
   ID:string:"<xsl:value-of select="@No"/>" 
   <xsl:apply-templates /> 
</xsl:template> 

如果您担心新线路,那么做这样的事情可能会更好(其中&#13;是回车以获得新线路)

<xsl:template match="//ID">
   <xsl:value-of select="concat('ID:string:&quot;', @No, '&quot;&#13;')" />
   <xsl:apply-templates/>
</xsl:template>

或许这个....

<xsl:template match="//ID">
   <xsl:text>ID:string:"</xsl:text>
   <xsl:value-of select="@No" />
   <xsl:text>"&#13;</xsl:text>
   <xsl:apply-templates/>
</xsl:template>

这是完整的XSLT

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

   <xsl:template match="//ID">
      <xsl:value-of select="concat('ID:string:&quot;', @No, '&quot;&#13;')" />
      <xsl:apply-templates/>
   </xsl:template>

   <xsl:template match="name|mark">
    <xsl:value-of select="concat(local-name()), ':string:&quot;', ., '&quot;&#13;')" />
   </xsl:template>
</xsl:stylesheet>

这应该会给出您期望的结果。

ID:string:"A-1"
name:string:"Jon"
mark:string:"80"
ID:string:"A-2"
name:string:"Ray"
mark:string:"81"

请注意我如何将名称标记的模板组合在一起以共享代码。