2015-08-27 226 views
0

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

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>

+0

你比较错误或为什么你说“不能比较var_value与任何字符串”?你得到哪个错误?什么是'//'['z:row']'应该选择?像''z:row''这样的非空字符串在任何情况下都会使谓词为真。 –

+0

不,我没有收到错误,但是如果我尝试将节点与定义的字符串进行比较,例如var_value是一个设置了内容的节点(Status0,Active),然后''返回false。 – Michelle

+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> 
+0

谢谢,但我想为z:row的每个属性创建一个节点。它应该看起来像这样:' AttributeValue'。这有效,但我不能检查值是否为空。 – Michelle

+0

恐怕我没跟着。为z:行的每个属性创建节点非常简单。这对变量有什么影响?你是什​​么意思“检查值是否为空”?这很容易 - 但是,你想要发生什么结果呢?另外,在你的例子中z:row有4个属性,但你的结果只有一个节点。 –

1

我怀疑你的错误是在该行

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

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

无论如何,你的理论是不正确的。比较一个节点和一个字符串是否正常工作(该节点是隐含地被雾化的)。