![](/img/trans.png)
[英]evaluate XPath expression not working for attribute (xml:lang) in indesign
[英]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
屬性中的模式可確保確實存在該模式。
每個軸都有一個主要節點類型。 如果軸可以包含元素,則主要節點類型為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.