我有一个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>
但它没有创建链接。
答案 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
。正确的版本是,例如:
<?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"
或者像那样。