xsl:value-of 用作 xsl:元素名称

发布于 2024-10-12 00:51:48 字数 1488 浏览 3 评论 0原文

我有一个带有列表结构的传入 XML 文件:

<list>
  <listItem>
    <name>elementOne</name>
    <value>elementOneValue</name>
  </listItem>
  <listItem>
    <name>elementTwo</name>
    <value>elementTwoValue</name>
  </listItem>
</list>

我正在尝试将其转换为以下结构:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

这是使用 XSL 实现的简单逻辑,但我遇到了复杂情况。

<xsl:for-each select="/list/listItem">
  <xsl:element name="<xsl:value-of select="name"/>">
    <xsl:value-of select="value"/>
  </xsl:element>
</xsl:for-each>

不起作用,因为我假设连续双引号破坏了 标签

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

不起作用,因为我无法使用 <<>> 并且

<xsl:for-each select="/list/listItem">
  &lt;<xsl:value-of select="name"/>&gt;
    <xsl:value-of select="value"/>
  &lt;/<xsl:value-of select="name"/>&gt;
</xsl:for-each>

不起作用,因为我最终得到 >且<在我的代码中,而不是 XML 可解析的 <>。我希望这是一个非常简单的解决方案,但我在互联网上找不到任何记录。我忽略的简单修复是什么?

I have an incoming XML file with a list structure:

<list>
  <listItem>
    <name>elementOne</name>
    <value>elementOneValue</name>
  </listItem>
  <listItem>
    <name>elementTwo</name>
    <value>elementTwoValue</name>
  </listItem>
</list>

Which I am trying to convert to this structure:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

This is easy logic to implement with XSL, but I'm running into complications.

<xsl:for-each select="/list/listItem">
  <xsl:element name="<xsl:value-of select="name"/>">
    <xsl:value-of select="value"/>
  </xsl:element>
</xsl:for-each>

Doesn't work because I assume the sequential double quotes are breaking the <xsl:element> tag

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

Doesn't work because I can't use << or >> and

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

Doesn't work because I end up with > and < in my code instead of XML parseable < or >. I expected this to be a very easy solution but I can't find any records for it on the internet. What is the simple fix I'm overlooking?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼泪淡了忧伤 2024-10-19 00:51:48

这是一个完整而简短的解决方案,使用 XSLT 指令

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

 <xsl:template match="listItem">
   <xsl:element name="{name}">
     <xsl:value-of select="value"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(已更正为格式良好):

<list>
    <listItem>
        <name>elementOne</name>
        <value>elementOneValue</value>
    </listItem>
    <listItem>
        <name>elementTwo</name>
        <value>elementTwoValue</value>
    </listItem>
</list>

产生了想要的结果

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

请注意

  1. 使用指令创建具有静态未知名称的元素。

  2. AVT 的使用 (Attribute-Value-Template)以紧凑且更易读的方式指定name属性。

  3. 如果 elementOneelementTwo 的字符串值不遵守以下词法/句法规则,则可能会引发错误元素名称 (QName)。

Here is a complete and short solution, using the <xsl:element> XSLT instruction:

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

 <xsl:template match="listItem">
   <xsl:element name="{name}">
     <xsl:value-of select="value"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the provided XML document (corrected to be well-formed):

<list>
    <listItem>
        <name>elementOne</name>
        <value>elementOneValue</value>
    </listItem>
    <listItem>
        <name>elementTwo</name>
        <value>elementTwoValue</value>
    </listItem>
</list>

the wanted result is produced:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

Do note:

  1. The use of the <xsl:element> instruction to create an element with statically unknown name.

  2. The use of AVT (Attribute-Value-Template) to specify the name attribute in a compact and more readable way.

  3. It is possible for an error to be raised if the string values of elementOne and elementTwo do not obey the lexical/syntactic rules for an element name (QName).

七月上 2024-10-19 00:51:48

我相信您可以使用花括号代替

<xsl:element name="{name}">
    <xsl:value-of select="value"/>
</xsl:element>

I believe you can use curly braces instead of <xsl:value-of>:

<xsl:element name="{name}">
    <xsl:value-of select="value"/>
</xsl:element>
恋竹姑娘 2024-10-19 00:51:48

没有尝试过,但这确实有效......

   <xsl:for-each select="/list/listItem">
      <xsl:variable name="elemName" select="name"/>
      <xsl:element name="$elemName">
        <xsl:value-of select="value"/>
      </xsl:element>
    </xsl:for-each>

Didn't try it but this sould work...

   <xsl:for-each select="/list/listItem">
      <xsl:variable name="elemName" select="name"/>
      <xsl:element name="$elemName">
        <xsl:value-of select="value"/>
      </xsl:element>
    </xsl:for-each>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文