2015-11-02 49 views
0

您好,我正在嘗試獲取處理指令中的僞屬性的值,並將該僞屬性的值放入該處理的每個實例的鍵值中指令。使用使用屬性中的處理指令的字符串值<xsl:key>

這樣的處理指令的例子看起來像這樣的XML內容:

<?uspc-assoc-workflow sws='C139995_131101' forum='2014/12' target='9S1' type='PCA'?> 

我的模板的下面是一個例子。我只看到了使用實際屬性的模板實例,但由於這是一個處理指令,因此我不能簡單地使用@sws作爲值,所以我嘗試使用以下命令來捕獲字符串中僞屬性的值:

<xsl:key name="uspcassocworkflow" match="processing-instruction('uspc-assoc-workflow')" use="substring-before(substring-after(., 'sws=&quot;'), '&quot;')"/> 

此編程是否有效?

我有第二組處理指令的所謂USPC-最終添加這個樣子:

<?uspc-end-add id='f104450-r0001' sws='C139995_131101' symbols='yes'?> 

和模板來匹配它看起來像這樣:

<xsl:template match="processing-instruction('uspc-end-add')" name="end_add"> 
    <!-- Need to be able to get the key values of the uspc-assoc-workflow sws psudo attribute here below --> 
    <xsl:for-each select="key('uspcassocworkflow', '@sws')"> 
    <!-- Then here I need to be able test if the variable value endswsnumber matches one of uspassocworkflow processing instructions key value --> 
    </xsl:for-each> 
    <xsl:variable name="id"><xsl:value-of select="substring-before(substring-after(., 'id=&quot;'), '&quot;')"/></xsl:variable> 
    <xsl:variable name="endswsnumber"><xsl:value-of select="substring-before(substring-after(., 'sws=&quot;'), '&quot;')"/></xsl:variable> 
    <xsl:variable name="symbol"><xsl:value-of select="substring-before(substring-after(., 'symbol=&quot;'), '&quot;')"/></xsl:variable> 

因此以上我正在嘗試將這些關鍵值引入此模板,然後我想測試變量endswsnumber是否與uspc-assoc-workflow PI的其中一個關鍵值相匹配。如果他們是匹配的,並且一旦我有相應的uspc-assoc-workflow PI。我將測試相應的uspc-assoc-workflow psudo屬性的值是否爲「目標」,併爲每個目標值輸出不同的跨度。因此,如果相應的uspc-assoc-workflow的目標值是'9S1',如上例所示,如果值爲'9S2',我將輸出一個跨度html,並在html中輸出不同的跨度。 「目標」psudo屬性只有幾個不同的值,所以我對每個屬性都進行測試。

謝謝。

+0

你不能用'@sws 「無論如何!你必須認爲它是一個字符串。此外,單引號用'''表示,而不是用'"'(用於雙引號)。您是否可以通過完整的XSLT將您的問題最小化爲只有一個期望的輸出,並且我們可以對其進行更新以實現輸出。 –

+0

我可以使用和後匹配值'sws ='並在關閉「'」之前將其添加到uspc-end-add PI中相同的對應值,而不事先知道實際字符串的值? – LearningandBurning

回答

0

我希望下面的例子將引導您正確的:

要選擇在下面輸入XML的處理指令:

<root> 
    <?uspc-assoc-workflow sws='C139995_131101' forum='2014/12' target='9S1' type='PCA'?> 
</root> 

您可以使用使用值C139995_131101關鍵以下樣式表選擇PI:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

<xsl:key name="uspcassocworkflow" match="processing-instruction('uspc-assoc-workflow')" use="substring-before(substring-after(., &quot;sws=&apos;&quot;), &quot;&apos;&quot;)"/> 

<xsl:template match="/"> 
    <output> 
     <xsl:copy-of select="key('uspcassocworkflow', 'C139995_131101')"/> 
    </output> 
</xsl:template> 

</xsl:transform> 

給出以下輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<output><?uspc-assoc-workflow sws='C139995_131101' forum='2014/12' target='9S1' type='PCA'?></output> 

這裏,密鑰找到作爲sws='之後和'之前的子串的PI uspc-assoc-workflow

check it out here

+0

你好Lingamurthy,感謝您的快速回復。但是不是使用實際值並指定我想要的密鑰(在這種情況下爲C139995_131101),我希望能夠使用'sws'psudo屬性的值與uspc-add-end PI psudo屬性匹配'sws'作爲一個變量。將會有多個uspc-assoc-workflow PI和多個uspc-add-end PI,我不知道除了它們每個都具有相應的匹配'sws'值外,'sws'值將會是什麼。那麼是否有可能在你的例子'C139995_131101'中變成一個匹配的變量值? – LearningandBurning

0

如果你有機會獲得撒克遜9的商用版本之一然後再考慮使用擴展功能saxon:get-pseudo-attributehttp://saxonica.com/html/documentation/functions/saxon/get-pseudo-attribute.html)它提供:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="saxon"> 

    <xsl:template match="processing-instruction('uspc-assoc-workflow')"> 
     <xsl:variable name="sws" select="saxon:get-pseudo-attribute('sws')"/> 
     <xsl:value-of select="$sws"/>   
    </xsl:template>  

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

</xsl:transform>