通过XSLT中的键值列表转换节点的名称

时间:2015-07-21 13:28:50

标签: xslt xslt-1.0

My Source XML示例如下所示。

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <T>A Book</T>
        <A>A Man</A>
        <D>Today</D>
    </cd>
</catalog>

“T”表示标题,“A”表示作者,“D”表示日期。 我想要的输出看起来像这样:

Title:A Book. Author:A Man. Date:Today

根据Implementing Key Value Concept in XSLT,我发现我可以像这样使用XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <my:codes>
   <code key="T" value="Title"/>
   <code key="A" value="Author"/>
   <code key="D" value="Date"/>
 </my:codes>

 <xsl:key name="kCodeByName" match="code" use="@key"/>

 <xsl:template match="/">
     <xsl:for-each select="catalog/cd/*">
        <xsl:apply-templates select="."/>:<xsl:value-of select="."/>.
     </xsl:for-each>
 </xsl:template>

 <xsl:template match= "node()[name() = document('')/*/my:codes/*/@key]">

  <xsl:variable name="vCur" select="name()"/>

  <xsl:for-each select="document('')">
      <xsl:value-of select=
       "key('kCodeByName', $vCur)/@value"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

但如果我想使用

<xsl:apply-templates select="name()"/>:<xsl:value-of select="."/>.

而不是

<xsl:apply-templates select="."/>:<xsl:value-of select="."/>.

我应该在XSLT中更改什么?

1 个答案:

答案 0 :(得分:1)

name()是一个函数,而不是一个节点;您不能将模板应用于它或在匹配模式中使用它。

为什么你不做:

XSLT 1.0

<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="codes">
   <code key="T" value="Title"/>
   <code key="A" value="Author"/>
   <code key="D" value="Date"/>
</xsl:variable>

<xsl:key name="kCodeByName" match="code" use="@key"/>

<xsl:template match="cd">
    <xsl:apply-templates/>
    <xsl:text>&#10;</xsl:text>  
</xsl:template>

<xsl:template match="cd/*">
    <xsl:variable name="vCur" select="name()"/>
    <xsl:for-each select="document('')">
        <xsl:value-of select="key('kCodeByName', $vCur)/@value"/>
    </xsl:for-each>
    <xsl:text>:</xsl:text>      
    <xsl:value-of select="."/>
    <xsl:if test="position()!=last()">
        <xsl:text>. </xsl:text> 
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

修改

如果您愿意,可以将最后一个模板更改为:

<xsl:template match="cd/*">
    <xsl:call-template name="lookup">
        <xsl:with-param name="key" select="name()"/>
    </xsl:call-template>
    <xsl:text>:</xsl:text>      
    <xsl:value-of select="."/>
    <xsl:if test="position()!=last()">
        <xsl:text>. </xsl:text> 
    </xsl:if>
</xsl:template>

并添加:

<xsl:template name="lookup">
    <xsl:param name="key"/>
    <xsl:for-each select="document('')">
        <xsl:value-of select="key('kCodeByName', $key)/@value"/>
    </xsl:for-each>
</xsl:template>