簡體   English   中英

xsl:value-of用作xsl:element名稱

[英]xsl:value-of used as xsl:element name

我有一個帶有列表結構的傳入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:element>標記

<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可解析的<>結尾。 我希望這是一個非常簡單的解決方案,但我在互聯網上找不到任何記錄。 我忽略的簡單解決方法是什么?

這是使用<xsl:element> 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. <xsl:element>指令的使用來創建具有靜態未知名稱的元素。

  2. 使用AVTAttribute-Value-Template )以緊湊和更易讀的方式指定name屬性。

  3. 如果elementOneelementTwo的字符串值不遵守元素名稱(QName)的詞法/語法規則,則可能會引發錯誤

我相信您可以使用花括號代替<xsl:value-of>

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

沒試過,但是辛苦了...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM