考慮下面的樣式表具有副本的XSLT和基本URI - 爲什麼uri會從XML文件更改爲XSLT文件?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template name="start">
<base-uris>
<node-base-uri>
<xsl:value-of select="base-uri(.)" />
</node-base-uri>
<node-base-uri-from-copy>
<xsl:variable name="doc">
<xsl:copy-of select="." />
</xsl:variable>
<xsl:value-of select="base-uri($doc)" />
</node-base-uri-from-copy>
</base-uris>
</xsl:template>
</xsl:stylesheet>
用下面的命令在命令行轉化任意的XML文件與撒克遜人後:
java net.sf.saxon.Transform -s:xml/index.xml -xsl:xsl/base-uri.xsl -it:start
我預料的一樣值指向XML基礎的URI源文件。但第二種情況下的基本URI(帶有copy-of)指向XSLT文件。
<base-uris>
<node-base-uri>file:/xml/index.xml</node-base-uri>
<node-base-uri-from-copy>file:/xsl/base-uri.xsl</node-base-uri-from-copy>
</base-uris>
動機:在「現實世界中的樣式表」我用一個模板中包含其他XML源。它們在源XML本身中指定(href屬性中的相對路徑)。
<xsl:template match="include" mode="includes">
<xsl:copy-of select="document(@href, .)/*"/>
</xsl:template>
從Spec:
節點的基礎URI被複制,除了在具有XML元素節點的情況下:base屬性
我問題:
首先,我會l瞭解如何從XML文件保留/設置/複製基本URI,而不是從XSLT文件中複製基本URI。
其次,我不明白規範和/或不明白xml:base屬性的東西。我只是想:我的代碼中沒有看到任何xml:base屬性,所以應該複製節點的基本URI。
最後一句話:
玩的時候,我想出了這樣的事情,感覺笨拙或乾脆錯誤的方式去:
<node-base-uri-work-around>
<xsl:variable name="doc">
<wrapper>
<xsl:attribute name="xml:base" select="base-uri(.)" />
<xsl:copy-of select="." />
</wrapper>
</xsl:variable>
<xsl:value-of select="base-uri($doc/wrapper)" />
</node-base-uri-work-around>
考慮準確地解釋你正在做什麼來運行轉換,你只發布了帶有命名模板的XSLT 3樣式表,而沒有顯示任何輸入XML,也沒有解釋如何運行轉換,這對於理解並告訴你的輸入來自哪裏以及如何知道/確定基本URI。至於使用' xsl:variable>',爲什麼不簡單使用' '? –
感謝Martin Honnen。只是在問題中提供了缺失的信息。是的,愚蠢的,爲什麼我只是不只是選擇文件?現在它工作正常。 – Stefan