2012-05-22 57 views
2

这里的价值选择XML元素是我的XML:XSLT:如何根据同级元素

<root> 
<parameters> 
<parameter> 
    <key>sEmail</key> 
    <value>[email protected]</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="[email protected]"> 
<parameters> 
    <parameter> 
     <key>sEmail</key> 
     <value>[email protected]</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

您可以测试一个子元素的值是 '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> 
+0

完美,可以接受在2分钟你的答案。正在尝试做同样的事情,但只是一个变量,不知道为什么它不起作用 – Lucas

+0

@Lucas欢迎您问为什么你的方法不起作用(在一个新的问题)。这可能有助于理解XSLT,它通常适用于我。 – topskip

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>[email protected]</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="[email protected]"> 
    <parameters> 
     <parameter> 
     <key>sEmail</key> 
     <value>[email protected]</value> 
     <type>string</type> 
     <length>255</length> 
     </parameter> 
     <parameter> 
     <key>sFirstName</key> 
     <value>Bill</value> 
     <type>string</type> 
     <length>40</length> 
     </parameter> 
    </parameters> 
</root>