簡體   English   中英

XPath for xml:lang? 測試屬性自軸失敗

[英]XPath for xml:lang? Testing attribute self axis fails

上下文是XSLT身份轉換,其中

<xsl:template match="abstract[@xml:lang]">
    <xsl:copy>
       <xsl:apply-templates select="@*[not(self::xml:lang)]|node()"/>
    </xsl:copy>
</xsl:template>

因此,我希望刪除屬性xml:lang

您應該已經看到以下警告:

警告! 從屬性節點開始時,自身軸永遠不會選擇任何元素節點

您可以改為測試屬性的name()

  <xsl:template match="abstract[@xml:lang]">
    <xsl:copy>
      <xsl:apply-templates select="@*[name() != 'xml:lang']|node()"/>
    </xsl:copy>
  </xsl:template>

這將根據請求有效地從abstract刪除xml:lang屬性。

self軸上永遠不會有一個屬性(除非您正在使用libxslt處理器...)。
看下面的評論討論

為什么不簡單地做:

<xsl:template match="abstract/@xml:lang"/>

專門抑制不需要的屬性?


工作演示: http : //xsltransform.net/eiZQaFp

這里的問題是self::[QName]只能引用一個元素 ,而不是屬性1

我認為michael.hor257k的建議最適合這種情況,在這種情況下檢查kjhughes的答案中的名字應該是可以的,因為它與xml命名空間有關,這是明確的。

但通常,如果您想不依賴name()排除單個屬性,則可以執行以下操作:

<xsl:template match="abstract[@xml:lang]">
    <xsl:copy>
       <xsl:apply-templates select="@*[(. | ../@xml:lang)[2]]|node()"/>
    </xsl:copy>
</xsl:template>

http://xsltransform.net/eiZQaFp/2

僅當存在xml:lang屬性時,此方法才能正常工作,但是您在match屬性中的模式可確保確實存在該模式。


  1. 這是XPath規范中的相關文本,解釋了為什么如此:

每個軸都有一個主要節點類型。 如果軸可以包含元素,則主要節點類型為element; 否則,它是軸可以包含的節點的類型。 從而,

  • 對於屬性軸,主要節點類型為attribute。
  • 對於名稱空間軸,主要節點類型為名稱空間。
  • 對於其他軸,主要節點類型為element。

當且僅當節點的類型(請參見[5數據模型])是主體節點類型並且其擴展名等於QName指定的擴展名時,作為QName的節點測試才為true。 例如,child :: para選擇上下文節點的para元素子元素; 如果上下文節點沒有para子級,它將選擇一個空節點集。 attribute :: href選擇上下文節點的href屬性; 如果上下文節點沒有href屬性,它將選擇一個空節點集。

self::的主要節點類型是元素,因此,如果其后跟一個QName(例如xml:lang ),那么self::xml:lang只能引用一個元素,而不是一個屬性。

暫無
暫無

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

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