如何在XSLT中迭代XML参数

时间:2011-02-23 18:40:41

标签: xslt msxsl

我有一个XML文件,我正在通过XSLT进行转换。我通过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>

但它没有创建链接。

5 个答案:

答案 0 :(得分:2)

XSLT参数与XML标记名称不同。使用here所述的标记传递参数。

如下面的评论所述,此问题与上述链接中提供的问题并无太大差异。

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);

以下是符合Accessing parameters which contain mark-up的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>

答案 1 :(得分: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>

答案 2 :(得分: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>

答案 3 :(得分:0)

您可能希望将包含链接的属性值放在其中:

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

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

答案 4 :(得分:0)

您发布的代码有点不正确。报价在哪里,什么是$附件? 你可能忘了提到名称空间,要正确选择,你需要写select="//file1:attachment"或者像那样。