#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 — это упорядочило его и также прояснило синтаксис.