2011-02-23 120 views
2

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

但它不会创建一个链接。

+0

你为什么要问了你的“代码”不工作的原因是什么?你克兰河传递到转化参数的实际值甚至不是格式良好的XML文档 - 你应该已经得到了你想要这个加载到如下的时候例外。不要谈论XSLT样式表。最好的建议是,你需要阅读和学习XML,XPath和XSLT的至少的基本知识。 – 2011-02-24 00:18:27

+0

现在这个问题已被很好地定义为MS特定的XSLT处理器。我认为@Dimitre可以提供帮助。 – 2011-02-24 14:09:08

回答

1

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

这里将XSL每Accessing parameters which contain mark-up匹配:

<?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> 
+0

jvm 2011-02-23 18:47:51

+0

<?xml version =“1.0”encoding =“utf-8”?> \t \t \t \t \t \t \t <的xsl:for-每个选择= “$附件”> \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t的 – jvm 2011-02-23 18:49:06

+0

@jatin - I假设那就是你的XSL - 但除此之外,我不太清楚你的评论表明了什么? – justkt 2011-02-23 18:49:27

0

你会希望把有像这样在它的链接你的属性值:

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

这选择当前XML元素的属性。

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> 
+0

@ChrisJ:'attachment' XPath表达式将选择上下文节点的附件子节点(参数未使用) – 2011-02-23 20:43:30

+0

@Ajjandro:在添加完整的XSLT后,我已经更新了答案。 – ChrisJ 2011-02-23 22:45:43

+0

@ChrisJ:现在更好。您写道:*“您必须至少有一个模板,以便XSLT转换处理您的输入XML文档”*。这不是真的。做测试。除此之外,你没有解决问题标题。 – 2011-02-23 23:04:22

0

您发布的代码是有点不正确。报价在哪里,什么是附件? 你可能忘了提及的命名空间,正确地选择,你需要写select="//file1:attachment"向往之类的。

+0

附件作为包含XML的参数传递 – jvm 2011-02-23 18:50:40

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>