2013-01-25 16 views
1

我試圖在xslt中做一個簡單的「查找替換」,但無法使其生成正確的輸出。我試圖遵循其他例子,但不幸的是,我沒有用XSLT做過多的工作,也找不到能夠做我想做的事情的例子。如果XSLT啓動時用XSLT取代元素值 - 給定的前綴,但保留其餘的XML原樣

我有下面的XML:

<metadata> 
<Permissions>site:abcdefg-123456-id1::{azeckoski}h,S,r</Permissions> 
<Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions> 
<Permissions>playlist:5678::{azeckoski}h,S,r</Permissions> 
<Permissions>playlist:7890::{azeckoski}H,s,r</Permissions> 
<Permissions>playlist:1234::{person1}H,s,R</Permissions> 
</metadata> 

而下面的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:package="info:srw/extension/13/package-v1.0" > 
<xsl:output omit-xml-declaration="yes" indent="no"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="metadata[starts-with(Permissions,'site:abcdefg-123456-id1::')]"> 
    <xsl:copy> 
    <xsl:text>site:abcdefg-123456-id1::{azeckoski}H,S,R</xsl:text> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

我想用下面的XML落得:

<metadata> 
<Permissions>site:abcdefg-123456-id1::{azeckoski}H,S,R</Permissions> 
<Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions> 
<Permissions>playlist:5678::{azeckoski}h,S,r</Permissions> 
<Permissions>playlist:7890::{azeckoski}H,s,r</Permissions> 
<Permissions>playlist:1234::{person1}H,s,R</Permissions> 
</metadata> 

但是我結束與此相反:

<metadata>site:abcdefg-123456-id1::{azeckoski}H,S,R</metadata> 

我不明白爲什麼XML文檔的其餘部分被清除。我以爲我使用身份模板來保留其他所有的東西。

回答

1

使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Permissions/text()[starts-with(.,'site:abcdefg-123456-id1::')]"> 
    <xsl:text>site:abcdefg-123456-id1::{azeckoski}H,S,R</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<metadata> 
    <Permissions>site:abcdefg-123456-id1::{azeckoski}h,S,r</Permissions> 
    <Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions> 
    <Permissions>playlist:5678::{azeckoski}h,S,r</Permissions> 
    <Permissions>playlist:7890::{azeckoski}H,s,r</Permissions> 
    <Permissions>playlist:1234::{person1}H,s,R</Permissions> 
</metadata> 

想要的,正確的結果產生:

<metadata> 
    <Permissions>site:abcdefg-123456-id1::{azeckoski}H,S,R</Permissions> 
    <Permissions>site:hjklqwe-098765-id2::{person2}h,S,r</Permissions> 
    <Permissions>playlist:5678::{azeckoski}h,S,r</Permissions> 
    <Permissions>playlist:7890::{azeckoski}H,s,r</Permissions> 
    <Permissions>playlist:1234::{person1}H,s,R</Permissions> 
</metadata> 

您的問題是你不處理(應用模板)metadata的孩子。

+0

我拿出了條狀空間和其他格式的變化,但否則這工作完美。謝謝! –

+0

@azeckoski,不客氣。 –

0

函數start-with()expect a string as first argument,不是節點()。您的匹配規則不正確。它應該是:

<xsl:template match="metadata/Permissions[starts-with(./text(),'site:abcdefg-123456-id1::')]"> 
... 
</xsl:template> 

這裏,測試的字符串,看它是否啓動與 '網站:ABCDEFG-123456-ID1 ::' 是metadata/Permissions/text()

+0

我很確定這場比賽實際上工作正常,它只是錯誤的輸出 –

+0

匹配可能與元數據元素匹配,但它只處理它的第一個孩子。 –