3

我有一个通过 XSLT 转换的 XML 文件。我通过 C# 将 XML 作为参数传递给 XSLT。参数的名称是附件,它包含 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>

但它不会创建链接。

4

5 回答 5

2

您可以将任何 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>
于 2011-02-23T20:15:52.740 回答
2

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>
于 2011-02-23T18:44:58.610 回答
2

它应该是<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>
于 2011-02-23T18:45:57.517 回答
0

您发布的代码有些不正确。引号在哪里,$attachment 是什么?您可能忘记提及命名空间,要正确选择,您需要编写select="//file1:attachment"或类似的东西。

于 2011-02-23T18:46:01.823 回答
0

您可能希望将包含链接的属性的值放在其中,如下所示:

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

这将为当前的 xml 元素选择一个属性。

于 2011-02-23T18:44:18.687 回答