【问题标题】:XSLT: Get Element Name of "Tokenized Item"XSLT:获取“标记化项目”的元素名称
【发布时间】:2016-03-10 22:09:07
【问题描述】:

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

这是我的数据样本集:

<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:element,但它一直给我上面提到的错误:

<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>

有人知道我该如何解决这个问题吗?提前感谢您的帮助!

【问题讨论】:

    标签: xslt xslt-2.0 xslt-grouping


    【解决方案1】:

    在 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”。我假设在一般情况下这不是真的。

    【讨论】:

    • 非常感谢您的解释!它现在可以正常工作了!
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2012-03-16
    • 2010-10-09
    • 2011-07-28
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多