XSLT:获取“Tokenized Item”的元素名称

时间:2016-03-10 22:09:07

标签: xslt xslt-2.0 xslt-grouping

有没有办法收集标记化值的元素名称?我一直试图这样做,但它给了我一个错误“[Saxon-PE 9.6.0.7] XPTY0004:name()的第一个参数的必需项类型是node();提供的值有项类型xs:string”< / p>

以下是我的数据样本集:

<SET>
  <REAL_TAGNAME> 1 2 3 4 </REAL_TAGNAME>
</SET> 

如果我使用此代码:

<xsl:for-each select="SET/REAL_TAGNAME">
    <xsl:for-each select="tokenize(normalize-space(.),'\s+')">
        <Hardcode_Tag>
            <xsl:value-of select="."/>
        </Hardcode_Tag>
    </xsl:for-each>
</xsl:for-each>

然后我将成功地拥有以下内容:

<Hardcode_Tag>1</Hardcode_Tag>
<Hardcode_Tag>2</Hardcode_Tag>
<Hardcode_Tag>3</Hardcode_Tag>
<Hardcode_Tag>4</Hardcode_Tag>

但我希望摆脱硬编码,并希望使用其原始标记名称来实现类似:

<REAL_TAGNAME>1</REAL_TAGNAME>
<REAL_TAGNAME>2</REAL_TAGNAME>
<REAL_TAGNAME>3</REAL_TAGNAME>
<REAL_TAGNAME>4</REAL_TAGNAME>

当我尝试下面的xsl:元素时,它会不断给我一个上面提到的错误:

<xsl:for-each select="SET/REAL_TAGNAME">
    <xsl:for-each select="tokenize(normalize-space(.),'\s+')">
        <xsl:element name="{name(.)}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:for-each>
</xsl:for-each>

有没有人知道如何解决这个问题?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在xsl:for-each中,表达式。 “当前项”是指当前项,即从元素的字符串值中提取的当前标记。如果你想在输入for-each之前记住当前元素的元素名称,只需在内部xsl:for-each之前设置一个变量:

<xsl:for-each select="SET/REAL_TAGNAME">
  <xsl:variable name="element-name" select="name(.)"/>
  <xsl:for-each select="tokenize(normalize-space(.),'\s+')">
    <xsl:element name="{$element-name}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:for-each>
</xsl:for-each>

在您显示的代码中,$ element-name的值总是为'REAL_TAGNAME'。我认为在一般情况下这不是真的。