2015-08-27 298 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/@*"

無論如何,你的理論是不正確的。比較一個節點和一個字符串是否正常工作(該節點是隱含地被霧化的)。