2

这是我的 XML:

<root>
<parameters>
<parameter>
    <key>sEmail</key>
    <value>cauchyjp@gmail.com</value>
    <type>string</type>
    <length>255</length>
</parameter>
<parameter>
    <key>sFirstName</key>
    <value>Bill</value>
    <type>string</type>
    <length>40</length>
</parameter>
</parameters>
<root>

我想检索键 sEmail 的值并将其作为属性添加到使用 XML 到 XML xslt 的根元素。

这是预期的结果:

<root email="cauchyjp@gmail.com">
<parameters>
    <parameter>
        <key>sEmail</key>
        <value>cauchyjp@gmail.com</value>
        <type>string</type>
        <length>255</length>
    </parameter>
    <parameter>
        <key>sFirstName</key>
        <value>Bill</value>
        <type>string</type>
        <length>40</length>
    </parameter>
</parameters>
<root>

类似于此链接的内容,但具有元素而不是属性的值。

有人能帮我吗 ?谢谢

4

2 回答 2

2

您可以测试子元素的值是否为“sEmail”:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="parameters">
    <parameters>
      <xsl:attribute name="email">
        <xsl:value-of select="parameter[key='sEmail']/value"/>
      </xsl:attribute>
      <xsl:copy-of select="*"/>
    </parameters>
  </xsl:template>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet> 
于 2012-05-22T10:09:36.857 回答
2

可以使用AVT以更清洁的方式完成:

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <root email="{*/*[key = 'sEmail']/value}">
    <xsl:apply-templates/>
  </root>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<root>
    <parameters>
        <parameter>
            <key>sEmail</key>
            <value>cauchyjp@gmail.com</value>
            <type>string</type>
            <length>255</length>
        </parameter>
        <parameter>
            <key>sFirstName</key>
            <value>Bill</value>
            <type>string</type>
            <length>40</length>
        </parameter>
    </parameters>
</root>

产生了想要的正确结果:

<root email="cauchyjp@gmail.com">
   <parameters>
      <parameter>
         <key>sEmail</key>
         <value>cauchyjp@gmail.com</value>
         <type>string</type>
         <length>255</length>
      </parameter>
      <parameter>
         <key>sFirstName</key>
         <value>Bill</value>
         <type>string</type>
         <length>40</length>
      </parameter>
   </parameters>
</root>
于 2012-05-22T12:50:34.847 回答