2013-10-30 100 views
1

我使用XSLT轉換爲XML節點值和我有一個webdocuments節點的XML型webdocument創建與其他節點的信息

<webDocuments> 
    <WebDocument> 
    <id>808924</id> 
    <fileName><![CDATA[file name]]></fileName> 
    <filePath><![CDATA[.../201504/808924/filename.pdf]]></filePath> 
    <hash><![CDATA[1c1bc9f96349fc954cba2dfb58f214b1]]></hash> 
    <title><![CDATA[Primer document]]></title> 
    <creationDate class="sql-timestamp">30/05/2012 15:49:57</creationDate> 
    </WebDocument> 
</webDocuments> 

的節點,我想文件路徑節點值轉換(文件系統)到一個URL。上面,有一個例子轉化,其中參數1應該是$散列,散列節點的值(在這種情況下1c1bc9f96349fc954cba2dfb58f214b1)和參數2應該是$ ID的ID節點值在這種情況下,808924

<webDocuments> 
    <WebDocument> 
    <id>808924</id> 
    <fileName><![CDATA[file name]]></fileName> 
    <filePath>http://url.com/param1=$hash&param2=$id</filePath> 
    <hash><![CDATA[1c1bc9f96349fc954cba2dfb58f214b1]]></hash> 
    <title><![CDATA[Primer document]]></title> 
    <creationDate class="sql-timestamp">30/05/2012 15:49:57</creationDate> 
    </WebDocument> 
</webDocuments> 

總之

<filePath>http://url.com/param1=1c1bc9f96349fc954cba2dfb58f214b1&param2=808924 

我嘗試了很多事情,但我沒有得到我預期的結果:

<xsl:template match="/webDocuments"> 
    <xsl:for-each select="/WebDocument"> 
    <xsl:value-of select="$hash"/> 
     <xsl:value-of select="concat($baseUrl,$baseCAPUrl,$hash,'&amp;fileId&#61;')"/> 

    </xsl:for-each> 
</xsl:template> 

總之我的結果是採取一個節點值,並用它來產生一個又一個。

在此先感謝

+0

提供完整的代碼。什麼是'$ baseUrl,$ baseCAPUrl,$ hash'? –

回答

0

這應該是你需要的。 Theres沒有真正需要使用concat(),您只需要連續的xsl:value-ofxsl:text節點即可實現您在此處需要的功能。此外,請嘗試design "push" templatesxsl:apply-templates,而不是使用xsl:for-each的「拉」模板。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="*"/> 
    </xsl:template> 

    <xsl:template match="WebDocument"> 
    <WebDocument> 
     <xsl:apply-templates select="*"/> 
    </WebDocument> 
    </xsl:template> 

    <xsl:template match="filePath"> 
    <filePath> 
     <!-- change below to the right value --> 
     <xsl:variable name="baseUrl">http://url.com</xsl:variable> 
     <!-- change below too, but I can't see where you use this in the URL --> 
     <xsl:variable name="baseCAPUrl">/CAP/</xsl:variable> 
     <xsl:value-of select="$baseUrl"/> 
     <xsl:text>/</xsl:text> 
     <xsl:value-of select="$baseCAPUrl"/> 
     <xsl:text>?param1=</xsl:text> 
     <xsl:value-of select="../hash"/> 
     <xsl:text>param2=</xsl:text> 
     <xsl:value-of select="../id"/> 
    </filePath> 
    </xsl:template> 

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

</xsl:stylesheet> 

給出:

<?xml version="1.0" encoding="UTF-8"?> 
<webDocuments> 
    <WebDocument> 
    <id>808924</id> 
    <fileName>file name</fileName> 
    <filePath>http://url.com//CAP/?param1=1c1bc9f96349fc954cba2dfb58f214b1param2=808924</filePath> 
    <hash>1c1bc9f96349fc954cba2dfb58f214b1</hash> 
    <title>Primer document</title> 
    <creationDate class="sql-timestamp">30/05/2012 15:49:57</creationDate> 
    </WebDocument> 
</webDocuments> 
+0

非常感謝它! – user670852

0

要注意的第一件事情就是你的XML不能很好地形成,因爲這條線

<filePath>http://url.com/param1=$hash&param2=$id</filePath> 

在這裏逃走了&需求。它應該是這樣的

<filePath>http://url.com/param1=$hash&amp;param2=$id</filePath> 

總之,在回答你的問題,它看起來像你想替換的文件路徑「變量」,與使用相同名稱的元素的XML實際值。

您已將此作爲XSLT2.0,這是很好的,因爲你可以使用XSL :分析串這裏尋找你的「變量」,如$哈希

<xsl:analyze-string select="." regex="\$\w+"> 

在此,您可以指定在找到「匹配子字符串」時要執行的操作。在這種情況下,您想要找到與剛剛匹配的變量名稱相同的元素(減去$前綴)。

<xsl:matching-substring> 
    <xsl:value-of select="$WebDocument/*[local-name() = substring(current(), 2)]"/> 
</xsl:matching-substring> 

(其中$ WebDocument是指向當前WebDocument元素在這種情況下,一個變量)

對於「不匹配」的字符串,你只是將它們作爲是

<xsl:non-matching-substring> 
    <xsl:value-of select="current()"/> 
    </xsl:non-matching-substring> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="filePath"> 
     <xsl:variable name="WebDocument" select=".."/> 
     <xsl:copy> 
     <xsl:analyze-string select="." regex="\$\w+"> 
      <xsl:matching-substring> 
       <xsl:value-of select="$WebDocument/*[local-name() = substring(current(), 2)]"/> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:value-of select="current()"/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

這應該輸出以下

<webDocuments> 
    <WebDocument> 
     <id>808924</id> 
     <fileName>file name</fileName> 
     <filePath>http://url.com/param1=1c1bc9f96349fc954cba2dfb58f214b1&amp;param2=808924</filePath> 
     <hash>1c1bc9f96349fc954cba2dfb58f214b1</hash> 
     <title>Primer document</title> 
     <creationDate class="sql-timestamp">30/05/2012 15:49:57</creationDate> 
    </WebDocument> 
</webDocuments> 

請注意,這裏使用的XSLT identity template量,輸出的所有其他節點原樣。