как перебрать XML-параметр в XSLT - PullRequest
3 голосов
/ 23 февраля 2011

У меня есть XML-файл, который я преобразовываю через XSLT. Я передаю XML в качестве параметра в XSLT через C #. Имя параметра - вложение, и оно содержит XML. Это написано следующим образом:

StringWriter sw = new StringWriter(); 
XmlTextWriter w = new XmlTextWriter(sw); 
w.WriteStartElement("root"); 
if (!string.IsNullOrEmpty(sWordFileName)) { 
    w.WriteStartElement("mylink", sWordFileName); 
    w.WriteEndElement(); 
}
if (!string.IsNullOrEmpty(sPDFFileName)) { 
    w.WriteStartElement("mylink", sPDFFileName);
    w.WriteEndElement();
}
w.Close();
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();
_exportSet[currentExportSet].Format.ParamList["attachment"] = nav.Select("./*");

Мой параметр xml выглядит как

<root><attachment xmlns=file1><attachment xmlns=file2></root>

Теперь в XSLT мне нужно перебрать этот параметр XML и создать ссылку.

Вот мой XSLT

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="2.0" xmlns:xsl="w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
        xmlns:my-scripts="urn:my-scripts" 
        xmlns="factiva.com/fcs/schemas/newsSummaries">

        <xsl:param name="attachment"/>
        <xsl:for-each select="$attachment">  
            <a target="_blank" href="#"><xsl:copy-of select="."/></a>  
         </xsl:for-each>
     </xsl:stylesheet>

Но это не создает ссылку.

Ответы [ 5 ]

2 голосов
/ 23 февраля 2011

Вы можете передать любой тип данных XPath / XSLT в качестве параметров .Как это сделать, полностью зависит от реализации процессора XSLT.

В качестве доказательства этой таблицы стилей с любым входным сигналом (не используется):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="attachment" select="document('parameter.xml')/root"/>
    <xsl:template match="/">
        <xsl:apply-templates select="$attachment"/>
    </xsl:template>
    <xsl:template match="attachment">
        <a target="_blank" href="{@href}">Link</a>
    </xsl:template>
</xsl:stylesheet>

И parameter.xml ресурс как:

<root>
    <attachment href="file1"/>
    <attachment href="file2"/>
</root> 

Вывод:

<a target="_blank" href="file1">Link</a>
<a target="_blank" href="file2">Link</a>
2 голосов
/ 23 февраля 2011

Параметр XSLT отличается от имени тега XML.Параметры передаются с использованием тега, как описано здесь .

Как указано в комментариях ниже, эта проблема не слишком отличается от той, что указана в приведенной выше ссылке.

StringWriter sw = new StringWriter(); 
XmlTextWriter w = new XmlTextWriter(sw); 
w.WriteStartElement("root"); 
if (!string.IsNullOrEmpty(sWordFileName)) { 
    w.WriteStartElement("attachment", sWordFileName); 
    w.WriteAttributeString("name", sWordFileName);
    w.WriteEndElement(); 
}
if (!string.IsNullOrEmpty(sPDFFileName)) { 
    w.WriteStartElement("attachment");
    w.WriteAttributeString("name", sPDFFileName);
    w.WriteEndElement();
}
w.WriteEndElement();
w.Close();
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();

XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddParam("attachment","",nav);

Здесь XSL будет соответствовать для Доступ к параметрам, которыесодержать наценку :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
   xmlns:xsl="w3.org/1999/XSL/Transform"
   xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
   xmlns:my-scripts="urn:my-scripts" 
   xmlns="factiva.com/fcs/schemas/newsSummaries">
    <xsl:param name="attachment" />

    <xsl:template match="/">
        <xsl:apply-templates select="$attachment"/>
    </xsl:template>
    <xsl:template match="attachment">
        <a target="_blank" href="{@name}">{@name}</a>
    </xsl:template>

</xsl:stylesheet>
2 голосов
/ 23 февраля 2011

Следует читать <xsl:for-each select="attachment">.... Знак $ отсутствует, поскольку attachment - это имя элемента XML, а не переменной.


РЕДАКТИРОВАТЬ после того, как вы дали полный XSLT и XML.

Есть несколько проблем с вашим XML:

  • Все теги должны быть закрыты.
  • Вы не можете использовать xmlns для чего-либо еще, для чего он предназначен - пространства имен.
  • Вы должны иметь двойные кавычки вокруг значений атрибута

Таким образом, правильная версия XML-файла будет (например):

<root>
  <attachment ptr="file1" />
  <attachment ptr="file2" />
</root>

Файл XSLT также имеет некоторые проблемы:

  • Пространство имен xsl должно быть связано с точным URI http://www.w3.org/1999/XSL/Transform.
  • У вас должен быть как минимум шаблон , чтобы преобразование XSLT обрабатывало ваш входной XML-документ.

Правильная версия будет, например:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
    <xsl:for-each select="attachment">  
      <a target="_blank" href="{@ptr}"><xsl:value-of select="@ptr" /></a>  
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

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

<a target="_blank" href="file1">file1</a>
<a target="_blank" href="file2">file2</a>
0 голосов
/ 23 февраля 2011

Код, который вы разместили, несколько неверен.Где цитаты, что такое $ вложение?Вы, вероятно, забыли упомянуть пространство имен, чтобы выбрать правильно, вам нужно написать select="//file1:attachment" или что-то подобное.

0 голосов
/ 23 февраля 2011

Вы хотели бы поместить значение вашего атрибута, содержащего ссылку, следующим образом:

<xsl:value-of select="@YourAttribute"/>

Выбирает атрибут для текущего элемента xml.

...