从XML读取属性值

时间:2015-08-27 15:35:39

标签: xml xslt xslt-2.0

我想用xsl转换和过滤xml文件,但是我遇到了问题。如果我尝试从节点获取属性的值,则变量var_value也是一个节点。在我看来,这就是为什么我无法将var_value与任何字符串进行比较的原因。我是对的吗?

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>
    <GetListItemsResponse>
      <GetListItemsResult>
        <listitems xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
          <rs:data ItemCount="1">
            <z:row ows_ID="1" ows_Status0="Active" ows_Priority="3" ows_Criticality="Critical" />
          </rs:data>
        </listitems>
      </GetListItemsResult>
    </GetListItemsResponse>
  </soap:Body>
</soap:Envelope>

XSLT:

<xsl:variable name="ar_Fields">
    <Field>ows_Status0</Field>
</xsl:variable>

<xsl:template match="/" name="TransformFields">
<xsl:param name="param_Attribute"/><xsl:variable name="var_EmptyDate" select="'1900-01-01 00:00:00'"/>
      <xsl:for-each select="//*['z:row']/@*">
        <xsl:variable name="var_Name" select="name()"></xsl:variable>
        <xsl:variable name="var_Value"><xsl:value-of select="string(.)"></xsl:value-of></xsl:variable>
        <xsl:for-each select="$ar_Fields">
            <xsl:if test="not($var_EmptyDate=$var_Value) and ($var_Name=$ar_Fields/.)">
                <xsl:call-template name="CreateElement">
                    <xsl:with-param name="param_Name" select="$var_Name"/>
                    <xsl:with-param name="param_Value" select="$var_Value"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:for-each>
      </xsl:for-each>
 </xsl:template>

 <xsl:template name="CreateElement">
    ...
 </xsl:template>

结果应如下所示:<Field Name="Status0">Active</Field>

2 个答案:

答案 0 :(得分:1)

我无法关注您的代码。无法做到这一点:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="#RowsetSchema"
exclude-result-prefixes="z">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="ar_Fields">
    <Field>ows_Status0</Field>
</xsl:variable>

<xsl:template match="/">
    <Field Name="Status0">
        <xsl:value-of select="//z:row/@*[name()=$ar_Fields/Field]"/>
    </Field>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

我怀疑你的错误在行

<xsl:for-each select="//*['z:row']/@*">

我不知道你打算做什么,但谓词['z:row']没用 - 字符串'z:row'的有效布尔值为true。也许你的谓词是[self::z:row]?但在那种情况下你为什么不写select="//z:row/@*"

无论如何,你的理论是不正确的。将节点与字符串进行比较可以正常工作(节点是隐式雾化的)。