Проблема с использованием функции xslt key () - PullRequest
0 голосов
/ 08 мая 2011

(отредактировано для включения предложений Мартина Хоннена)

Привет всем,

Я пытался заставить функцию ключа работать правильно в приведенной ниже таблице стилей.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date"
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        xmlns:m="http://mapping.tables" >


<xsl:key name="preferences" match="preferences/preference" use="@code"/>

<xsl:template match="Reservation/Detail" >
    <xsl:for-each select="Preferences/Preference">
        <xsl:if test ="string-length(./PreferenceCode)>0">

            &#160;&#160;&#160;&#160;* (<xsl:value-of select="./PreferenceCode"/>)

            <xsl:choose>
                <xsl:when test="./PreferenceCode!='PETS'">

                    <xsl:call-template name="prefmap">
                            <xsl:with-param name="code" select="./PreferenceCode"/>
                    </xsl:call-template>

                    <br/><br/>
                </xsl:when>
            </xsl:choose>
        </xsl:if>
    </xsl:for-each>
</xsl:template


<xsl:template name="prefmap">
        <xsl:param name="code"/>
        You got here (called template) with code <xsl:value-of select="$code"/>
              <xsl:for-each select="document('')">
        <xsl:value-of select="key('preferences',$code)"/>
    </xsl:for-each>
</xsl:template>

<m:Maps xmlns="">
<preferences>
        <preference code="ANT">
                Hypoallergenic Bedding
        </preference>
        <preference code="NSK">
                Non-smoking Room
        </preference>
        <preference code="SMK">
                Smoking Room
        </preference>
</preferences>
</m:Maps>

</xsl:stylesheet>

Он принимает входные данные (которые я не контролирую) и выдает это:

* (ANT) You got here (called template) with code ANT


* (EARLY) You got here (called template) with code EARLY


* (NSK) You got here (called template) with code NSK

Когда я ожидал:

* (ANT) You got here (called template) with code ANT
  Hypoallergenic Bedding

* (EARLY) You got here (called template) with code EARLY

* (NSK) You got here (called template) with code NSK
Non-smoking Room

Я попытался включить этот фрагмент восновной шаблон для отладки, но он не выдал:

            <xsl:for-each select="key('preferences',./PreferenceCode)">
                <p>
                    Code: <xsl:value-of select="@code"/><br />
                    Description: <xsl:value-of select="."/>
                </p>
            </xsl:for-each>

У меня проблема с определением ключа или способом, которым я пытаюсь его использовать?

Спасибо всем завперед.

Ответы [ 2 ]

1 голос
/ 08 мая 2011

Вы пытаетесь поместить данные в вашу таблицу стилей с этими preferences/pref элементами? Разве они не должны быть в отдельном пространстве имен? И ключи создаются для каждого документа, а функция key с XSLT 1.0 ищет узлы в документе, к которому принадлежит узел контекста. Если вы хотите искать узлы в самой таблице стилей, вам нужно сначала изменить узел контекста, например, например, <xsl:for-each select="document('')"><xsl:value-of select="key('preferences', $code)"/></xsl:for-each>. Затем удалите начальный / из значения атрибута match и убедитесь, что вы помещаете элементы в элемент контейнера в отдельном пространстве имен, например,

<xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date"
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        xmlns:m="http://mapping.tables" 
        xmlns:data="http://example.com/data">


<xsl:key name="preferences" match="preferences/pref" use="@code"/>

<data:data xmlns="">
<preferences>
        <pref code="ANT">
                Hypoallergenic Bedding
        </pref>
        <pref code="NSK">
                Non-smoking Room
        </pref>
        <pref code="SMK">
                Smoking Room
        </pref>
</preferences>
</data:data>
0 голосов
/ 08 мая 2011

Есть ли у меня проблема с определением ключа или способом его использования?

Нет проблем с любым из них:

Я не могу воспроизвести указанный вывод .Это означает, что если действительно есть какая-либо проблема, она находится в коде, который нам не показан.

Предоставленное преобразование :

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:m="http://mapping.tables" >

    <xsl:key name="preferences" match="preferences/preference" use="@code"/>

    <xsl:template match="Reservation/Detail" >
        <xsl:for-each select="Preferences/Preference">
            <xsl:if test ="string-length(./PreferenceCode)>0">              &#160;&#160;&#160;&#160;* (
                <xsl:value-of select="./PreferenceCode"/>)              
                <xsl:choose>
                    <xsl:when test="./PreferenceCode!='PETS'">
                        <xsl:call-template name="prefmap">
                            <xsl:with-param name="code" select="./PreferenceCode"/>
                        </xsl:call-template>
                        <br/>
                        <br/>
                    </xsl:when>
                </xsl:choose>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
    <xsl:template name="prefmap">
        <xsl:param name="code"/>         You got here (called template) with code 
        <xsl:value-of select="$code"/>
        <xsl:for-each select="document('')">
            <xsl:value-of select="key('preferences',$code)"/>
        </xsl:for-each>
    </xsl:template>
    <m:Maps xmlns="">
        <preferences>
            <preference code="ANT">
              Hypoallergenic Bedding
            </preference>
            <preference code="NSK">
             Non-smoking Room
            </preference>
            <preference code="SMK">
             Smoking Room
            </preference>
        </preferences>
    </m:Maps>
</xsl:stylesheet>

при применениив следующем XML-документе (XML-документ не был предоставлен в вопросе!):

<Reservation>
    <Detail>
        <Preferences>
            <Preference>
              <PreferenceCode>ANT</PreferenceCode>
            </Preference>
            <Preference>
              <PreferenceCode>NSK</PreferenceCode>
            </Preference>
            <Preference>
              <PreferenceCode>SMK</PreferenceCode>
            </Preference>
            <Preference>
              <PreferenceCode>PETS</PreferenceCode>
            </Preference>
        </Preferences>
    </Detail>
</Reservation>

дает точно ожидаемый результат :

<?xml version="1.0" encoding="utf-8"?>
                      * (
                ANT)              
                         You got here (called template) with code 
        ANT
              Hypoallergenic Bedding
            <br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/><br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/>                  * (
                NSK)              
                         You got here (called template) with code 
        NSK
             Non-smoking Room
            <br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/><br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/>                  * (
                SMK)              
                         You got here (called template) with code 
        SMK
             Smoking Room
            <br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/><br xmlns="http://www.w3.org/1999/xhtml" xmlns:date="http://www.oracle.com/XSL/Transform/java/java.util.Date" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:m="http://mapping.tables"/>                  * (
                PETS)              

Примечание:

Все следующие 7 процессоров XSLT дают точно такой же (приведенный выше) результат: MSXML3 / 4, XslCompiledTransform, XslTransform, Saxon 6.5.4, Saxon 9.1.05, AltovaXML (XMLSpy).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...