2016-11-03 198 views
0

命名空間,我有以下XML轉換XML使用XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<typeNames xmlns="http://www.dsttechnologies.com/awd/rest/v1" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <typeName recordType="case" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLECASE">SAMPLECASE</typeName> 
    <typeName recordType="folder" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEFLD">SAMPLEFLD</typeName> 
    <typeName recordType="source" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEST">SAMPLEST</typeName> 
    <typeName recordType="transaction" href="awdServer/awd/services/v1/businessareas/SAMPLEBA/types/SAMPLEWT">SAMPLEWT</typeName> 
</typeNames> 

我想通過使用XSLT如下轉換上面的XML:

<response> 
     <results> 

       <source> 
        SAMPLEST 
       </source> 

     </results> 
     </response> 
    </xsl:template> 

我只是想從輸入源xml到輸出xml。

我想用下面的XML,但無法獲得所需的輸出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v="http://www.dsttechnologies.com/awd/rest/v1" version="2.0" exclude-result-prefixes="v"> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="typeNames"> 
     <response> 
     <results> 

       <source> 
        <xsl:value-of select="source" /> 
       </source> 

     </results> 
     </response> 
    </xsl:template> 
</xsl:stylesheet> 
+0

你已經聲明瞭一個前綴,但你沒有使用它。並且在輸入XML –

回答

2

一命名空間中輸入XML

<typeNames xmlns="http://www.dsttechnologies.com/awd/rest/v1"... 

xmlns把自我+所有子女節點到名稱空間中。這個命名空間不需要任何前綴。

二,命名空間中的XSLT

... xmlns:v="http://www.dsttechnologies.com/awd/rest/v1"... 

您與v前綴命名空間(相同的URI源),所以你必須寫這個前綴在你的XPath爲好。

<xsl:template match="v:typeNames"> 

[XSLT 2.0:您還可以在樣式表部分添加xpath-default-namespace="uri",定義所有的XPath表達式默認命名空間。因此,您不必在名稱空間前綴。]

三。猜對給定的輸入XML

<xsl:value-of select="source" /> -> <typeName recordType="source"..>SAMPLEST</typeName> 

如果您想選擇的顯示XML節點,你必須寫下列之一:

absolute, without any context node: 
/v:typeNames/v:typeName[@recordType = 'source'] 

on context-node typeNames: 
v:typeName[@recordType = 'source'] 

[<xsl:value-of select="..."/>將返回文本節點(S ),例如「SAMPLEST」]


編輯:

如果有兩個標籤。

首先要做的事情:XSLT 1中的<xsl:value-of只能使用1個節點!如果xpath表達式匹配多個節點,它將只處理第一個節點!

解決它像這樣:

... 
<results> 
    <xsl:apply-templates select="v:typeName[@recordType = 'source']"/> 
</results> 
... 

<xsl:template match="v:typeName[@recordType = 'source']"> 
    <source> 
     <xsl:value-of select="."/> 
    </source> 
</xsl:template> 

apply-templatesresults搜索所有typeName..source。匹配模板偵聽該節點並創建xml <source>...

+1

中沒有'source'元素很好解釋。謝謝.. !! –

+0

如果有兩個''標籤和''作爲源,我們想要檢索所有'recordType =「source」'的每個值,會發生什麼?例如,像這樣:' SAMPLEST ORIGINAL' –

+1

請參閱編輯我的答案。 – uL1