XSLT - 检查是否存在某些元素或节点

时间:2014-01-13 06:08:12

标签: xml xslt xpath

我一直在谷歌上搜索下面的方法,我得到了一些点击,不过,没有人为我工作。

我有传入的XML,它们是2个XML中的任何一个。

<Session>
      <SessionID>1231</SessionID>
      <ClientID>556677</ClientID>
</Session>

<Session>
      <SessionID>1231</SessionID>
      <CompanyID>1060</CompanyID>
</Session>

基于以上所述,XML可以从CompanyId到ClientId。我想转换他的XML,但为了做到这一点,我需要一种方式来说:

如果我获得ClientID,那么只获取值并转换XML,以便显示如下:

<?xml version="1.0" encoding="UTF-8"?>
<Sessions xmlns="http://mysite/services/v1">
      <a:Session>1231</a:Session>
      <a:Client>556677</a:Client>
</Sessions>

如果我获得CompanyID,我将转换为以下

<?xml version="1.0" encoding="UTF-8"?>
    <Sessions xmlns="http://mysite/services/v1">
          <a:Session>1231</a:Session>
          <a:Company>1060</a:Company>
    </Sessions>

XML将包含元素CLientID或具有CompanyID的元素,但不包含两者....

我试图使用以下内容但没有成功:

<xsl:choose> 
 <xsl:when test="/Session/ClientID"> 
<a:Client>
 <xsl:value-of select="a:Session/a:ClientId"/>
  </a:Client>
 </xsl:choose> 

我希望能够检查XML上是否包含“ClientID”的元素,我可以从中获取值并创建一个名为“Client”的元素...如果我使用公司获取XML,则会出现相同的情况。

有什么想法吗?谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

请尝试此模板。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="www.sample_namespace.com"
    version="1.0">

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

<xsl:template match="Session">
    <xsl:element name="Sessions" namespace="http://mysite/services/v1">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="SessionID">
    <a:Session><xsl:apply-templates/></a:Session>
</xsl:template>

<xsl:template match="ClientID">
    <a:Client><xsl:apply-templates/></a:Client>
</xsl:template>

<xsl:template match="CompanyID">
    <a:Company><xsl:apply-templates/></a:Company>
</xsl:template>

</xsl:stylesheet>

尝试使用上面的示例XML时:

<Session>
    <SessionID>1231</SessionID>
    <CompanyID>1060</CompanyID>
</Session>

产生结果:

<Sessions xmlns="http://mysite/services/v1">
    <a:Session xmlns:a="www.sample_namespace.com">1231</a:Session>
    <a:Company xmlns:a="www.sample_namespace.com">1060</a:Company>
</Sessions>