XPATH в XSLT - XML-файлы DITA - PullRequest
       16

XPATH в XSLT - XML-файлы DITA

0 голосов
/ 23 декабря 2010

У меня есть XML с именем "map.xml", который вызывает другой xml "map1.xml" .Map.xml имеет ссылку на map.xsl.

В XSLT мне нужно написать код, чтобы получить значение узла, присутствующее в map1.xml? Кто-нибудь из вас может предложить решение для этого?

Ниже кода, специфичного для стандартов DITA

map1.xml:

    <?xml version="1.0" encoding="UTF-8"?>
       <!-- code to refer XSLT -->
          <map title="DITA Topic Map">
  <topicref href="client.xml"/>
       </map>

map2.xml:

    <?xml version="1.0" encoding="UTF-8"?>
     <concept id="map2">
 <title>Client Rights</title>
 <conbody>
  <p>Part of your job as a healthcare provider.</p>
 </conbody>
       </concept>

Ответы [ 3 ]

3 голосов
/ 15 февраля 2013

Использование функции document () XSLT выглядит следующим образом.

Например, чтобы получить содержимое / значение элемента p в map2.xml:

<xsl:value-of select="document('map2.xml')/concept/conbody/p"/>

Не проверял это на вашем примере, но я бы попробовал это!*

1 голос
/ 16 февраля 2013

Я думаю, что источники должны выглядеть следующим образом (со ссылкой на DTD или схему, а не на таблицу стилей):

map.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
<map title="DITA Topic Map">
  <topicref href="client.xml"/>
</map>

client.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept id="client.xml">
 <title>Client Rights</title>
 <conbody>
  <p>Part of your job as a healthcare provider.</p>
 </conbody>
</concept>

Предложение Дэвида верное, оно дает вам следующий результат:

Part of your job as a healthcare provider.

Чтобы уточнить это: Чтобы использовать функцию специализации DITA, вы бы предпочли использовать что-то вроде этого:

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

<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="*[contains(@class, ' map/topicref ') and @href]">
    <xsl:variable name="topic" select="document(@href, .)"/>
    <xsl:value-of select="$topic//*[contains(@class, ' topic/p ')]"/>
</xsl:template>

</xsl:stylesheet>

С данными выборки это приводит к тому же результату. Но если бы у вас был специализированный элемент параграфа , полученный из

, вы все равно могли бы использовать то же преобразование для нового элемента.

1 голос
/ 23 декабря 2010

Используйте функцию XSLT document () для доступа к узлам в отдельном XML-документе. Простой пример (любезно предоставлен w3schools.com) можно найти здесь .

Я новый пользователь, поэтому ТАК мешает мне опубликовать в своем ответе вторую ссылку. Вот лучшее, что я могу сделать: объяснение document () в стандарте XSLT можно найти по адресу www.w3.org/TR/xslt#document.

.
...