簡體   English   中英

XSLT 1.0從嵌套XML中提取值

[英]XSLT 1.0 Extract values from nested XML

我正在嘗試從現有的XML中獲取特定的XML。 你能幫忙嗎?

源XML:

<?xml version="1.0" encoding="utf-8"?>
<row>
    <column name="testName">Test 1</column>
    <column name="Tests">
        <XmlDoc xmlns="Customers servers">
            <Tests>
                <Test>
                    <cuFirst>Hardware</cuFirst>
                    <cuLast>Server 1</cuLast>
                </Test>
                <Test>
                    <cuFirst>Hardware</cuFirst>
                    <cuLast>Server 2</cuLast>
                </Test>
            </Tests>
        </XmlDoc>
    </column>     
    <column name="Company">Some Company</column>
    <column name="Company address" />
    <column name="Company URL" />
    <column name="Company Alias">Company Alias</column>
</row>

當前的XSLT(無法正常工作); 我確實嘗試了不同的方法,但是什么也沒有。 我會繼續嘗試,但是如果您有任何幫助的想法,請這樣做。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output indent="no" />
  <xsl:template match="/">
    <Tests>
      <xsl:for-each select="//column[@name='Tests']">
        <ci>
          <xsl:value-of select="//column[@name='Tests']/XmlDoc/Tests/Test//cuLast" disable-output-escaping="no" />
        </ci>
      </xsl:for-each>
      <Test>
        <xsl:value-of select="//column[@name='testName']" disable-output-escaping="no" />
      </Test>
    </Tests>
  </xsl:template>
</xsl:stylesheet>

所需的輸出XML

<Tests>
    <Test>
        <cuLast>Test 1</cuLast>
    </Test>
    <Test>
        <cuLast>Server 1</cuLast>
    </Test>
    <Test>
        <cuLast>Server 2</cuLast>
    </Test>
</Tests>    

第一件事: XmlDoc元素及其所有后代都位於自己的名稱空間中; 您必須在樣式表中聲明此名稱空間,為其分配前綴,並在尋址這些節點時使用該前綴。

同樣,在XSLT中,必須明確:避免// //如果您知道確切的路徑。

嘗試以下樣式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cs="Customers servers"
exclude-result-prefixes="cs">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <Tests>
        <Test><xsl:value-of select="row/column[@name='testName']"/></Test>
        <xsl:for-each select="row/column[@name='Tests']/cs:XmlDoc/cs:Tests/cs:Test">
            <ci>
                <xsl:value-of select="cs:cuLast" />
            </ci>
        </xsl:for-each>
    </Tests>
</xsl:template>

</xsl:stylesheet>

當應用於您的輸入時,結果將是:

<?xml version="1.0" encoding="UTF-8"?>
<Tests>
   <Test>Test 1</Test>
   <ci>Server 1</ci>
   <ci>Server 2</ci>
</Tests>

另請注意, "Customers servers"不是有效的URI,因此不是命名空間的好選擇。 不過,不確定是否對此有任何控制權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM