xslt:如何根据兄弟元素的值选择XML元素

时间:2012-05-22 10:01:58

标签: xml xslt

这是我的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 to 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>

this link类似但具有元素值而非属性的值。

有人能帮助我吗?感谢

2 个答案:

答案 0 :(得分: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> 

答案 1 :(得分: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>