繁体   English   中英

转换前更新 XSL 文件

[英]Update XSL file before transform

TNT 以 XML 和 XSL 文件的形式提供清单数据以将该数据转换为。

然后输出是用于打印的清单的 HTML 文件。

这是 XSL 文件:

https://express.tnt.com/expresswebservices-website/stylesheets/HTMLManifestRenderer.xsl

在 xsl 文件中有以下内容:

<xsl:apply-templates select="PACKAGE[position() >= 1 and position() < 4]" mode="int"/>

使用我在这方面极其有限的知识,这似乎阻止了清单中显示的 3 个以上的项目。

我想取消这个限制。 就像将“< 4”更改为“< 9999”一样简单

我有以下有效的代码:

public static string TransformXmlStringWithXslString(string xmlString, string XSLStylesheetUrl)
{
    AppContext.SetSwitch("Switch.System.Xml.AllowDefaultResolver", true);

    // process our xml
    XmlTextReader xmlTextReader = new XmlTextReader(new StringReader(xmlString));
    XPathDocument xPathDocument = new XPathDocument(xmlTextReader);

    XsltSettings settings = new XsltSettings(true, true);

    // process the xsl
    XmlTextReader xmlTextReaderXslt = new XmlTextReader(XSLStylesheetUrl);
    XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
    xslCompiledTransform.Load(xmlTextReaderXslt, settings, new XmlUrlResolver());

    // handle the output stream
    StringBuilder stringBuilder = new StringBuilder();
    TextWriter textWriter = new StringWriter(stringBuilder);

    // do the transform
    xslCompiledTransform.Transform(xPathDocument, null, textWriter);
    return stringBuilder.ToString();
}

在将 XML 推送到该值之前更新该值的最佳方法是什么?

与其修改样式表,不如考虑编写一个覆盖样式表来导入提供的样式表并替换相关的模板规则:

<xsl:stylesheet ...>
<xsl:import href="existingStylesheet.xsl"/>
<xsl:param name="maxPackages" select="5"/>

<xsl:template match="CONSIGNMENT" mode="IntPacks">
<div class="row packages">
<div class="packagescolumn1">
<div class="Line100">
<font class="newheader"> Description (incl. packing and marks) </font>
</div>
</div>
<div class="packagescolumn2">
<div class="Line100">
<font class="newheader"> Dimensions (L x W x H) </font>
</div>
</div>
<div class="packagescolumn3">
<div class="Line100">
<font class="newheader"> Total Consignment Volume   </font>
<font class="newdata">
<xsl:value-of select="concat(format-number(TOTALVOLUME, '##0.000'), ' ', PACKAGE/VOLUME/@units)"/>
</font>
</div>
</div>
<xsl:apply-templates select="PACKAGE[position() >= 1 and position() &lt;= $maxPackages]" mode="int"/>
</div>
</xsl:template>

</xsl:stylesheet>

最简单的方法是将XSL 样式表(不要与 XML 模式混淆!)加载到 XDocument 中,然后找到要更改的元素。 此代码找到您所追求的特定元素并进行更改:

var xslNS = (XNamespace) "http://www.w3.org/1999/XSL/Transform";
    
var xdoc = XDocument.Load(@"https://express.tnt.com/expresswebservices-website/stylesheets/HTMLManifestRenderer.xsl");
var xelement = xdoc
    .Descendants(xslNS + "apply-templates")
    .Where(e => (string) e.Attribute("select") == "PACKAGE[position() >= 1 and position() < 4]" 
       && (string) e.Attribute("mode") == "int");
var apply = xelement.First();
apply.SetAttributeValue("select", "PACKAGE[position() >= 1 and position() < 9999]");    

然后,您可以在 XDocument 实例上使用CreateReader方法来获取获取已编译 XSL 所需的阅读器。 将其合并到您的代码中,它看起来像这样:

public static string TransformXmlStringWithXslString(string xmlString, string XSLStylesheetUrl)
{
     AppContext.SetSwitch("Switch.System.Xml.AllowDefaultResolver", true);

     // process our xml
     XmlTextReader xmlTextReader = new XmlTextReader(new StringReader(xmlString));
     XPathDocument xPathDocument = new XPathDocument(xmlTextReader);

     XsltSettings settings = new XsltSettings(true, true);

     // process the xsl
     var xslNS = (XNamespace) "http://www.w3.org/1999/XSL/Transform";
     
     var xdoc = XDocument.Load(XSLStylesheetUrl);
     var xelement = xdoc
         .Descendants(xslNS +"apply-templates")
         .Where(e => (string) e.Attribute("select") == "PACKAGE[position() >= 1 and position() < 4]" 
            && (string) e.Attribute("mode") == "int");
     var apply = xelement.First();
     apply.SetAttributeValue("select", "PACKAGE[position() >= 1 and position() < 9999]");
     
     XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
     xslCompiledTransform.Load(xdoc.CreateReader(), settings, new XmlUrlResolver());

     // handle the output stream
     StringBuilder stringBuilder = new StringBuilder();
     TextWriter textWriter = new StringWriter(stringBuilder);

     // do the transform
     xslCompiledTransform.Transform(xPathDocument, null, textWriter);
     return stringBuilder.ToString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM