включая файл second.xml.Имеет ли значение, где эта ссылка встречается в xslt?
Это может произойти где угодно, даже на корневом уровне.Но его определение, например, в шаблоне ограничивает его использование соответствующей областью (если не передано с параметром).
Значение элемента FKey будет иметь значение, совпадающее с первичнымXML-файл.
Это можно сделать с помощью простого выражения предиката.Здесь я выбрал
$secondXmlDoc/root/bobo[FKey=$ID]
, который выбирает узел bobo
из вторичного XML-файла, значение FKey
которого совпадает с переменной ID
.
I'mзапутался в том, как передать переменную из primary.xml в primary.xml.
Нет.Оба XML-файла доступны из одного и того же XSLT.Но вы забыли добавить xsl:param...
со строкой
<xsl:template name="Phones" match="/">
<xsl:param name="FKey">
...
в целевой шаблон.Кстати, вероятно, не стоит называть параметр таким же, как узел - это может создать путаницу.
В целом шаблон XSLT-1.0 может выглядеть следующим образом.Я поместил директиву document(...)
на верхний уровень, чтобы вы могли получить к ней доступ из любого места в файле XSLT.И я удалил call-template
, потому что в этом не было необходимости.Если вам это нужно, убедитесь, что вы добавили xsl:param...
в целевой шаблон для получения параметра (вы не делали этого в приведенном выше коде).
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="html" indent="yes" encoding="utf-8" omit-xml-declaration="yes"/>
<xsl:variable name="secondXmlDoc" select="document('subfolder/secondary.xml')"/>
<xsl:template match="/root">
<xsl:for-each select="bobo">
<xsl:variable name="ID" select="@ID" />
<xsl:value-of select="FirstName"/> <xsl:value-of select="LastName"/><br />
<xsl:value-of select="Address"/><br />
<xsl:value-of select="City"/>, <xsl:value-of select="State"/> <xsl:value-of select="Zip"/><br />
<xsl:variable name="secBobo" select="$secondXmlDoc/root/bobo[FKey=$ID]" />
<xsl:if test="$secBobo"> <!-- Check if there is a matching entry in seconday.xml -->
Ph. <xsl:value-of select="$secBobo/HomePhone"/><br />
Cell <xsl:value-of select="$secBobo/MobilePhone"/><br />
Fax <xsl:value-of select="$secBobo/Fax"/><br /><br />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Вывод не очень красивый,но я думаю, вы легко можете позаботиться об этом сами.