2014-09-28 49 views
-1

我想写XSLT文档的源XML和我确实有追求的目标XML太(它应该是什么样子)需要创建XSLT的帮助下,我有源和目标XML

我的资料来源是这样的:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
<a xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/"> 
    <b> 
    <c> 
     <d> 
     <e MemberID="1" /> 
     <e MemberID="2" /> 
     <e MemberID="3" /> 
     </d> 
    </c> 
    </b> 
</a> 
</soap:Body> 
</soap:Envelope> 

我想要实现的是(目标XML)

<d> 
    <e ID="1" /> 
    <e ID="2" /> 
    <e ID="3" /> 
</d> 

我一直在努力写我的XSLT,但不能得到它的工作。我一直在使用一些在线工具,在那里我给我的源代码和编写XSLT,但我没有得到任何结果。 (从来没有在XSLT工作)

有人可以帮我写这个或指向我的写作方向。

我曾尝试是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="a/b/c/d"/> 
    </xsl:template> 
    <xsl:template match="d"> 
<d> 
    <xsl:for-each select="e"> 
    <e> 
      <xsl:value-of select="@MemberID"/> -- I know its wrong, but just want something to work     
    </e> 
    </xsl:for-each> 
</d> 
    </xsl:template> 
</xsl:stylesheet> 

感谢

+0

为什么你的样式包括文字上的''元素,当你需要的输出不? - P.S.您尝试的主要问题是您忽略源文档的**命名空间**。 – 2014-09-28 14:38:07

回答

1

您需要分配前缀由源文件使用的每个命名空间,解决源文件中的元素时,使用适当的前缀。这是你的样式表的修正:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" 
exclude-result-prefixes="soap dir"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="soap:Envelope/soap:Body/dir:a/dir:b/dir:c/dir:d"/> 
</xsl:template> 

<xsl:template match="dir:d">  
    <d> 
     <xsl:for-each select="dir:e"> 
      <e> 
       <xsl:value-of select="@MemberID"/>     
      </e> 
     </xsl:for-each> 
    </d> 
</xsl:template> 

</xsl:stylesheet> 

这将产生以下结果:

<?xml version="1.0" encoding="utf-8"?> 
<d> 
    <e>1</e> 
    <e>2</e> 
    <e>3</e> 
</d> 

当然,你可以简化这个到:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" 
exclude-result-prefixes="soap dir"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/"> 
    <d> 
     <xsl:for-each select="soap:Envelope/soap:Body/dir:a/dir:b/dir:c/dir:d/dir:e"> 
      <e> 
       <xsl:value-of select="@MemberID"/>     
      </e> 
     </xsl:for-each> 
    </d> 
</xsl:template> 

</xsl:stylesheet> 

为了达到所需的输出,更改:

  <e> 
       <xsl:value-of select="@MemberID"/>     
      </e> 

到:

  <e ID="{@MemberID}"/>