所以我有以下格式的XML文件:移動通過XSLT從一個XML文件屬性到另一個
[...]
<level1>
<para id="1"/>
<image type="photo" artist="Joe"/>
<para id="2"/>
<para id="3"/>
<level2>
<para id="4"/>
<image type="pencil" artist="Bob"/>
<para id="5"/>
</level2>
<para id="6"/>
<image type="oil" artist="Joe"/>
</level1>
[...]
的問題是,在圖像屬性並不總是正確的,他們沒有唯一的標識符。我有另一個具有所有正確屬性的文件。我試圖編寫一個將刪除不正確屬性的轉換,然後從我的其他文件中放置正確的屬性。
這是我到目前爲止有:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- ============================================================= -->
<xsl:variable name="target" select="document('correct.xml')//image"/>
<xsl:template match="image">
<xsl:variable name="vPath1">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="concat('/',name())"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="vPath2">
<xsl:for-each select="$target[ancestor-or-self::*]">
<xsl:value-of select="concat('/',name())"/>
</xsl:for-each>
</xsl:variable>
<xsl:copy>
<xsl:if test="$vPath1=$vPath2">
<xsl:copy-of select="$target/@*"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
這成功地刪除所有我的不正確的屬性,但它並沒有將正確的。這似乎是我的'如果'的聲明從來沒有打,但我知道路徑是相同的。我做錯了什麼?
我correct.xml看起來是這樣的(這也是輸出應該是什麼樣子):
[...]
<level1>
<para id="1"/>
<image type="pencil" artist="Joe"/>
<para id="2"/>
<para id="3"/>
<level2>
<para id="4"/>
<image type="photo" artist="Steve"/>
<para id="5"/>
</level2>
<para id="6"/>
<image type="oil" artist="Bob"/>
</level1>
[...]
您驗證了'$ vPath1 = $ vPath2'與' xsl:message>'etc? –
我對xslts還是很缺乏經驗,所以我沒有那樣做。我試了一下,我的$ vPath1沒問題,但是我的$ vPath2只是返回'figure/figure/figure/...' 任何想法在設置變量時出錯了? – Beeblebrox42
您使用的是XSL 1.0還是2.0? –