2011-01-14 26 views
5

tôi có nhiều tệp Xml, trong một List<File>. Những gì tôi muốn là để biến đổi những xml vào một Xml với một XSL:Viết ở cuối xml

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="testsuites"> 
    <xsl:call-template name="summary"/> 
</xsl:template> 

<xsl:template name="summary"> 
      <xsl:variable name="testCount" select="sum(testsuite/@tests)"/> 
     <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/> 
     <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/> 
<xsl:variable name="timeCount" select="sum(testsuite/@time)"/> 
     <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> 
      <xsl:attribute name="class"> 
       <xsl:choose> 
        <xsl:when test="$failureCount &gt; 0">Failure</xsl:when> 
        <xsl:when test="$errorCount &gt; 0">Error</xsl:when> 
       </xsl:choose> 
      </xsl:attribute> 
     <Build> 
      <NombreTest><xsl:value-of select="$testCount"/></NombreTest> 
      <Failures><xsl:value-of select="$failureCount"/></Failures> 
      <Erreurs><xsl:value-of select="$errorCount"/></Erreurs> 
     <PercentSucces><xsl:call-template name="display-percent"> 
        <xsl:with-param name="value" select="$successRate"/> 
       </xsl:call-template></PercentSucces> 
      <ExecTime><xsl:call-template name="display-time"> 
        <xsl:with-param name="value" select="$timeCount"/> 
       </xsl:call-template> </ExecTime> 
      </Build> 
     </xsl:template> 

<xsl:template match="failure"> 
    <xsl:call-template name="display-failures"/> 
</xsl:template> 

<xsl:template match="error"> 
    <xsl:call-template name="display-failures"/> 
</xsl:template> 

<xsl:template name="display-time"> 
    <xsl:param name="value"/> 
    <xsl:value-of select="format-number($value,'0.000')"/> 
</xsl:template> 

<xsl:template name="display-percent"> 
    <xsl:param name="value"/> 
    <xsl:value-of select="format-number($value,'0.00%')"/> 
</xsl:template> 

<xsl:template name="display-failures"> 
    <xsl:choose> 
     <xsl:when test="not(@message)">N/A</xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@message"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Vấn đề của tôi là khi tôi đang lặp và áp dụng các thay đổi với một TransformerFactory nó luôn luôn xóa XML đầu ra. Thay vào đó, tôi muốn chỉnh sửa đầu ra.

Tôi biết rằng tôi có thể làm điều đó trong java với một XML tạm thời và sau khi hợp nhất nó, nhưng tôi gần như chắc chắn rằng nó có thể trong XSL?

Cảm ơn vì đã giúp

+0

Câu hỏi của bạn không rõ ràng. Bạn có muốn chạy chuyển đổi của mình dựa trên một số tài liệu đầu vào không? Hoặc bạn có muốn truy cập một số tài liệu đầu vào từ một chuyển đổi không? –

+0

tôi muốn chạy phép chuyển đổi cho nhiều (cùng một cấu trúc, cùng một biểu định kiểu) xml và đặt kết quả theo một xml – Theo

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi để giải thích và một giải pháp điển hình. Ngoài ra, bạn cần phải tìm hiểu từ tài liệu về bộ xử lý XSLT của bạn cách chuyển các tham số cho phép biến đổi. –

Trả lời

1

Bạn cần phải vượt qua tất cả các URL tài liệu trong vòng một tham số bên ngoài duy nhất và bạn thường sẽ có một phép biến đổi như thế này:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pdocNames"> 
    <name>doc1.xml</name> 
    <name>doc2.xml</name> 
    <name>doc3.xml</name> 
</xsl:param> 

    <!-- you can directly use $pdocNames/name 
     if the param is provided externally --> 
<xsl:variable name="vDocNames" select= 
    "document('')/*/xsl:param[]@name='pdocNames']/name"/> 

<xsl:template match="/"> 
    <combinedDocs> 
    <xsl:copy-of select="document($vDocNames)"/> 
    </combinedDocs> 
</xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng trên bất kỳ tài liệu XML (không sử dụng), nó thực hiện các sau:

  1. có được các yếu tố name chứa cung cấp trong tham số $pdocNames tài liệu URI. Các phần tử này được chứa trong biến số vDocNames.

  2. Tạo phần tử trên cùng cho tài liệu đầu ra (trong trường hợp này có tên combinedDocs).

  3. Bản sao tất cả các tài liệu XML, mà URI đang trong name yếu tố chứa trong vDocNames biến. Hàm XSLT chuẩn document() được sử dụng tại đây.

Do lưu ý:

Các URL của tất cả muốn tài liệu XML phải được thông qua từ bên ngoài thông qua một tham số để chuyển đổi. Nó phụ thuộc vào nhà cung cấp cách chuyển một tham số cho phép biến đổi. Bạn cần phải đọc tài liệu được cung cấp cho bộ xử lý XSLT cụ thể của bạn.

+0

cảm ơn rất nhiều, nó thực sự giúp đỡ. Nhưng về phần tử 'name', tôi có một danh sách đường dẫn nhưng nó không nằm trong một xlm với phần tử. tôi có thể đưa vào thông số như sau: [/Users/admin/Documents/testxml/20101119-2254/20101122-1255/TESTS-TestSuites.xml,/Users/admin/Documents/testxml/20101119-2254/TESTS-TestSuites .xml, ...] – Theo

+0

có lẽ tôi có thể tạo danh sách xml tất cả các tệp, có vẻ như đó là đơn giản nhất – Theo

+1

@Theo: Vâng, đây là một giải pháp khác - đặc biệt khi các tệp được biết đến tĩnh. Đối với việc truyền một tham số có chứa một phần tử XML hoặc một đoạn XML - có, điều này có thể xảy ra. Nó chắc chắn là có thể cho XslCompiledTransform trong .NET –

Các vấn đề liên quan