2014-08-29 76 views
0

在我的請求中有大約500個子元素,並且這些元素具有屬性ID,id是可選元素。我用波紋管代碼片段來轉換我的請求ID屬性。驗證XSLT中的id屬性

<xsl:if test="@id"> 
    <xsl:attribute name="id"> 
     <xsl:value-of select="@id" /> 
    </xsl:attribute> 
</xsl:if> 

有什麼辦法可以在普通的地方做<xsl:if test="@id">驗證,影響到所有的地方。否則,我必須在每個地方查看。

請指教我。比你...

+0

這對我沒有意義。你爲什麼要測試是否有'id'屬性,然後創建一個,如果已經有一個?請解釋這個的目的。同時顯示更多XSLT代碼,輸入XML,輸出結果以及您的XSD(因爲您使用'xsd'標記了問題並提及驗證)。 – 2014-08-29 10:47:06

+0

如果我在沒有的情況下使用,請求在我的變換中有沒有id屬性的元素,那麼put元素的id就沒有值。如此。如果它不在請求中,我不想創建id屬性。正因爲如此,我使用了測試條件。 – user3496599 2014-08-29 11:15:04

+0

@MathiasMüller – user3496599 2014-08-29 11:45:39

回答

1

這段代碼基本上覆制id屬性從輸入到輸出(如果存在的話),否則什麼也不做。這整個片段可以通過

<xsl:copy-of select="@id"/> 

因爲copy-of更換什麼都不做,如果選擇的節點集合是空的。

1

我沒有看到您的代碼除了複製已經存在的內容之外的任何內容。

在任何情況下,如果你想要一個轉型適用於有id屬性的所有元素,編寫模板匹配的屬性,例如:

<xsl:template match="@id"> 
    <xsl:attribute name="new-id"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

這將保留現有的值,並重命名該屬性。

1

通常你會開始一個樣式表與身份轉換模板

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

該副本由水平,通過節點的節點一切的水平。然後,您可以添加需要特殊處理的元素和/或屬性的模板。

現在,只要您確保您的元素模板爲<xsl:apply-templates select="@*"/><xsl:apply-templates select="@id"/>,屬性就會被複制。

如果你想變換一個元素,然後添加一個模板,例如,

<xsl:template match="/Address"> 
    <Add> 
    <xsl:apply-templates select="@* , node()"/> 
    </Add> 
</xsl:template> 
+0

'<! - 改變標籤 - > 的 \t \t \t \t '這是我的代碼,我的輸入xml是'

\t ABC
'但它不是在輸出中創建屬性ID。 – user3496599 2014-08-29 11:37:46

+0

請注意,我寫了'mode =「#all」'和'mode =「#current」'。至於更改元素,請注意您需要執行apply-templates。我將編輯並顯示。 – 2014-08-29 11:48:47

+0

如果我使用了「mode =」#all「和mode =」#current「我得到了波紋管錯誤一個屬性的值必須是QName或空格分隔的QNames列表的值爲'#all'' 致命錯誤:'無法編譯樣式表' – user3496599 2014-08-29 12:02:16