簡體   English   中英

如何在 XSLT 中獲取祖先軸上的屬性

[英]How to get an attribute on the ancestor axis in XSLT

我有 xml:

<msg id="abc" type="test">
  <local id="def"/>
  <cnts x:type="fld" id="111" type="a2">
  </cnts>
</msg>

xslt 是:

<xsl:template match="contents[@x:type='fld']">
  <xsl:variable name="msgs">
    <xsl:for-each select="ancestoer::msg">
      <msg><xsl:value-of select="@type"/></msg>
    </xsl:for-each>
  </xsl:variable>
</xsl:template>

我希望輸出是:

<msg>test</msg>

但它沒有按預期工作。 有人可以幫忙嗎?

您的 XSLT 和 XML 有幾個問題,每個問題可能是也可能不是問題的原因:

  1. 您的 XSLT 不完整,您這樣做可能是為了節省空間,但它使您更難猜測出了什么問題(命名空間綁定、應用模板等)
  2. 您的 XML 與您的 XSLT 不匹配,如評論中所述,模板匹配不在您的 XML 中的元素contents (您的意思是cnts嗎?)。
  3. 您的代碼片段,即使包含在有效的xsl:stylesheet元素中,也無法編譯, ancestoer::msg將引發編譯時(靜態)錯誤。
  4. 您的代碼段定義了一個變量,但不使用它,因此您的變量中的任何內容都將不可見。
  5. 您似乎想遍歷祖先軸,它可以選擇多個元素msg ,不確定這是故意的

如果以上所有內容在您的實際 XSLT 中都是正確的,那么您的問題就出在其他地方,我們將不得不查看更多的 XSLTXML,事實上,我們需要一個最小、完整和可驗證的示例

也就是說,以下是使用祖先軸的三種方式:

  1. 如果您只需要一項,則不需要中間變量,只需使用<xsl:value-of select="ancestor::msg/@type" />
  2. 如果要遍歷所有祖先,可以使用:

     <xsl:template match="contents[@x:type='fld']"> <xsl:apply-templates select="ancestor::msg" mode="anc" /> </xsl:template> <xsl:template match="msg" mode="anc"> <msg><xsl:value-of select="@type" /></msg> </xsl:message>

    在這個例子中,我故意切換模式,因為很有可能你已經在其他地方匹配了msg ,在這種情況下你可能會陷入一個永無止境的循環。

  3. 您當前使用xsl:for-each 這並沒有錯,只是不那么靈活,從長遠來看,打字更多。 不需要使用變量,但如果您想使用變量,只需確保您也使用它,例如使用xsl:copy-of

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM