在<xsl:key>

时间:2015-11-02 01:21:24

标签: xml xslt key

Hello我试图在处理指令中获取伪属性的值,并将该伪属性的值放入该处理指令的每个实例的键值中。

因此,处理指令的示例在xml内容中如下所示:

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

我的模板示例如下。我只看到使用实际属性的模板实例,但由于这是一个处理指令,我不能简单地使用@sws作为值,所以我试图通过使用这个来捕获字符串中伪属性的值: / p>

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

此代码是否有效?

我有第二组处理指令uspc-end-add,如下所示:

<?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属性对于“target”的值是什么,并为每个目标值输出不同的span。因此,如果相应的uspc-assoc-workflow的目标值是'9S1',如上例所示,我将输出一个span html vs在html中输出不同的span,如果值为'9S2'。 “目标”psudo属性只有几个不同的值,所以我对每个属性进行测试。

感谢。

2 个答案:

答案 0 :(得分: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>

此处,密钥会在uspc-assoc-workflow之后和C139995_131101之前找到sws='作为子字符串的PI '

check it out here

答案 1 :(得分:0)

如果您可以访问其中一个Saxon 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>