如何在XSLT中迭代XML参数

我有一个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>
但它没有创建链接。     
已邀请:
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>
    
您可以将任何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>
    
它应该是
<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>
    
您可能希望将包含链接的属性的值放在其中,如下所示:
<xsl:value-of select="@YourAttribute"/>
这将选择当前xml元素的属性。     
您发布的代码有些不正确。报价在哪里,什么是$附件? 你可能忘了提到命名空间,要正确选择,你需要写
select="//file1:attachment"
或者像那样。     

要回复问题请先登录注册