2017-02-14 5 views
0

У меня проблема с ключевой функцией, функция ключа не работает в следующем коде.XSL: KEY Функция для внешнего файла

мой вход

XML (Keys.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<Keys> 
    <Key year="2001" name="ABC"/> 
    <Key year="2002" name="BCA"/> 
</Keys> 

XML для преобразования

<?xml version="1.0" encoding="UTF-8"?> 
<p> 
    <text> .. .. <key>ABC</key> ...</text> 
    <text> .. .. <key>BCA</key> ...</text> 
</p> 

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:key name="keydata" match="*[name() = document('keys.xml')]/Keys/Key" use="@name"/> 
    <xsl:template match="key"> 
     <xsl:copy> 
      <xsl:attribute name="ref"><xsl:value-of select="key('keydata', .)/@year"/></xsl:attribute> 
      <xsl:value-of select="."/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Выход

<p> 
    <text> .. .. <key ref="">ABC</key> ...</text> 
    <text> .. .. <key ref="">BCA</key> ...</text> 
</p> 

Желаемая Ouput

<p> 
    <text> .. .. <key ref="2001">ABC</key> ...</text> 
    <text> .. .. <key ref="2002">BCA</key> ...</text> 
</p> 
+0

Такой предикат '[имя() = документ ('keys.xml')]' не кажется правильным. У вас есть сообщение об ошибке? – potame

+0

нет, нет сообщения об ошибке – Rupesh

ответ

1

Это должно работать:

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

    <xsl:variable name="keys" select="document('keys.xml')" as="document-node()"/> 

    <xsl:key name="keydata" match="Key" use="@name"/> 

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

    <xsl:template match="key"> 
     <xsl:copy> 
      <xsl:attribute name="ref"><xsl:value-of select="$keys/key('keydata', current())/@year"/></xsl:attribute> 
      <xsl:value-of select="."/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

В спецификации XSL, есть пример под названием «Example: Using Keys to Reference other Documents», что в точности соответствует случаю использования.

Это итоговый документ:

<?xml version="1.0" encoding="UTF-8"?> 
<p> 
    <text> .. .. <key ref="2001">ABC</key> ...</text> 
    <text> .. .. <key ref="2002">BCA</key> ...</text> 
</p> 
+0

Спасибо, сейчас работает – Rupesh

1

<xsl:key name="keydata" match="*[name() = document('keys.xml')]/Keys/Key" use="@name"/> Изменение к <xsl:key name="keydata" match="Keys/Key" use="@name"/>, а затем <xsl:attribute name="ref"><xsl:value-of select="key('keydata', .)/@year"/></xsl:attribute> к <xsl:attribute name="ref" select="key('keydata', . doc('Keys.xml'))/@year"/></xsl:attribute>.

+0

Спасибо за вашу помощь – Rupesh

 Смежные вопросы

  • Нет связанных вопросов^_^