簡體   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