XSL изменяет вывод на основе наличия данных элемента в другом файле

#xslt

Вопрос:

Все это ново для меня, и я пытаюсь узнать, как это работает, изучив и изменив некоторые ранее существовавшие XSL в нашей системе, поэтому, пожалуйста, извините, что у меня на самом деле нет тестового сценария для устранения неполадок.

У меня есть экспортированный список комнат, существующих в нашей системе, и обзор критериев в этих комнатах. Я хочу просмотреть обследованную комнату и изменить поведение вывода в зависимости от того, существует ли он при экспорте или нет. Ниже приведены некоторые примеры данных, которые дают представление о том, чего я хочу достичь. Я просто не уверен, как (а) ссылаться на ссылочный xml и (б) запрашивать его таким образом.

XML-список ссылок (имя = spaces.xml):

 <Listing>
    <Space>
        <Code>Room1</Code>
    </Space>
    <Space>
        <Code>Room2</Code>
    </Space>
    <Space>
        <Code>Room3</Code>
    </Space>
    <Space>
        <Code>Room4</Code>
    </Space>
</Listing>
 

Пример XML опроса

 <Survey>
    <Record>
        <Ref>1</Ref>
        <Space>Room1</Space>
        <Data>123</Data>
    </Record>
    <Record>
        <Ref>2</Ref>
        <Space>Room2</Space>
        <Data>456</Data>
    </Record>
    <Record>
        <Ref>3</Ref>
        <Space>Room5</Space>
        <Data>789</Data>
    </Record>
</Survey>
 

Поскольку комнаты 5 нет в списке, выходные данные должны вести себя по-другому

Пока что XSLT. Это не включает ссылку на listing.xml файл или надлежащее условие тестирования

 xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"/>
    <xsl:template match="Record">
        <OutputData>
            <SurveyRef>
                <xsl:value-of select="Ref"/>
            </SurveyRef>
            <xsl:choose>
                <xsl:when test="##SPACE IS PRESENT IN SPACES.XML##">
                    <SpaceRef>
                        <xsl:value-of select="Space"/>
                    </SpaceRef>
                    <xsl:otherwise>
                        <SpaceRef>CheckTheSpace</SpaceRef>
                    </xsl:otherwise>
                </xsl:choose>
                <SurveyResult>
                    <xsl:value-of select="Data"/>
                </SurveyResult>
            </OutputData>
        </xsl:template>
    </xsl:stylesheet>
 

Ожидаемый результат

 <OutputData>
    <SurveyRef>1</SurveyRef>
    <SpaceRef>Room1</SpaceRef>
    <SurveyResult>123</SurveyResult>
</OutputData>
<OutputData>
    <SurveyRef>2</SurveyRef>
    <SpaceRef>Room2</SpaceRef>
    <SurveyResult>456</SurveyResult>
</OutputData>
<OutputData>
    <SurveyRef>3</SurveyRef>
    <SpaceRef>CheckTheSpace</SpaceRef>
    <SurveyResult>789</SurveyResult>
</OutputData>
 

Любая помощь в этом очень признательна, так как я уверен, что это поможет мне более эффективно использовать этот инструмент
.

Спасибо.

Комментарии:

1. Обратите внимание, что ожидаемый результат-это фрагмент XML, а не хорошо сформированный XML — документ-в нем отсутствует один корневой элемент.

Ответ №1:

как (а) создать ссылку на справочный xml

Это зависит от того, где именно будет находиться справочный документ. Если вы разместите его в том же месте, где находится ваша таблица стилей XSLT, вы можете ссылаться на него, используя только его имя в document() функции. В противном случае вам нужно использовать либо относительный, либо полный абсолютный путь.

и (б) запросите его таким образом.

Наиболее удобный способ разрешить перекрестную ссылку-это использовать ключ, например:

XSLT 2.0

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

<xsl:key name="spc" match="Space" use="Code" />

<xsl:template match="/Survey">
    <root>
        <xsl:for-each select="Record">
            <OutputData>
                <SurveyRef>
                    <xsl:value-of select="Ref"/>
                </SurveyRef>
                <SpaceRef>
                    <xsl:value-of select="if (key('spc', Space, document('space.xml'))) then Space else 'CheckTheSpace'"/>
                </SpaceRef>
                <SurveyResult>
                    <xsl:value-of select="Data"/>
                </SurveyResult>
            </OutputData>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>
 

Комментарии:

1. Спасибо @Michael.hor257k — это упорядочило его и также прояснило синтаксис.