xsl导航似乎不起作用

时间:2014-03-06 15:10:06

标签: xml xslt

我不确定为什么这不起作用。

这是我的xml:

<s:Body xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<LoginBodyResponse xmlns="http://tempuri.org">
<LoginBodyResult>somettext</LoginBodyResult>
</LoginBodyResponse>
</s:Body>

这是我当前的xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
            exclude-result-prefixes="msxsl var s0"
            version="1.0"
            xmlns:ns0="http://tempuri.org"
            xmlns:s0="http://tempuri.org">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="LoginBodyResponse">
  <ns0:LoginBodyReponse>
    <xsl:if test="LoginBodyResult">
      <LoginBodyResult>
        <xsl:value-of select="LoginBodyResult/text()" />
      </LoginBodyResult>
    </xsl:if>
  </ns0:LoginBodyReponse>
</xsl:template>
</xsl:stylesheet>

我无法进入此模板。我真的不确定为什么它不会进入LoginBodyResponse节点。我假设我犯了一个愚蠢的小错误,但无法弄清楚它的问题。我还将模板匹配设置为* /,当我这样做时,它永远不会在xsl:if部分找到LoginBodyResult。

我基本上在寻找这个输出:

  <ns0:LoginBodyReponse xmlns:ns0="http://tempuri.org">
   <LoginBodyResult>somettest</LoginBodyResult>
  </ns0:LoginBodyReponse>

1 个答案:

答案 0 :(得分:3)

这是因为LoginBodyResponse位于默认命名空间http://tempuri.org中。您将需要在xpath中为元素添加前缀。

未经测试的例子:

<xsl:template match="ns0:LoginBodyResponse">
    <ns0:LoginBodyReponse>
        <xsl:if test="ns0:LoginBodyResult">
            <LoginBodyResult>
                <xsl:value-of select="ns0:LoginBodyResult" />
            </LoginBodyResult>
        </xsl:if>
    </ns0:LoginBodyReponse>
</xsl:template>

此外,如果您删除重复的命名空间声明xmlns:s0="http://tempuri.org"(并从s0删除exclude-prefix-results),您应该获得所需的输出。