2013-10-09 101 views
-1

我在尋找一個xsl代碼,它可以過濾給定xml數據文件的一些重要元素。以下示例顯示了關於父親和他的兩個孩子的全部數據。xslt 1.0用於過濾重要元素

這個文件是我的輸入文件:

<?xml version="1.0" encoding="UTF-8"?> 
<person> 
    <is_parent>true</is_parent> 
    <name>Sam</name> 
    <sex>male</sex> 
    <age>45</age> 
    <body_properties> 
     <heigth>183</heigth> 
     <weight>86</weight> 
     <eye_color>green</eye_color> 
    </body_properties> 

    <person> 
     <is_parent>false</is_parent> 
     <name>Julia</name> 
     <sex>female</sex> 
     <age>11</age> 
     <body_properties> 
      <heigth>155</heigth> 
      <weight>40</weight> 
      <eye_color>blue</eye_color> 
     </body_properties> 
    </person> 

    <person> 
     <is_parent>false</is_parent> 
     <name>Tom</name> 
     <sex>male</sex> 
     <age>4</age> 
     <body_properties> 
      <heigth>100</heigth> 
      <weight>35</weight> 
      <eye_color>brown</eye_color> 
     </body_properties> 
    </person> 
</person> 

有時候我只是想有「最重要」的信息。例如,我需要名稱,年齡和眼睛的顏色。

這個數據必須要在我的輸出文件:

<?xml version="1.0" encoding="UTF-8"?> 
<person> 
    <name>Sam</name> 
    <age>45</age> 
    <body_properties> 
     <eye_color>green</eye_color> 
    </body_properties> 

    <person> 
     <name>Julia</name> 
     <age>11</age> 
     <body_properties> 
      <eye_color>blue</eye_color> 
     </body_properties> 
    </person> 

    <person> 
     <name>Tom</name> 
     <age>4</age> 
     <body_properties> 
      <eye_color>brown</eye_color> 
     </body_properties> 
    </person> 
</person> 

有時候我只希望有其他的「最重要」的信息。例如,我需要性別,身高和體重。當然,在這種情況下,我需要另一個xsl文件。

作爲一個額外的要求,XSL必須支持輸入數據文件沒有父母,例如:

<person> 
    <is_parent>false</is_parent> 
    <name>Peter</name> 
    <sex>male</sex> 
    <age>23</age> 
    <body_properties> 
     <heigth>195</heigth> 
     <weight>99</weight> 
     <eye_color>blue</eye_color> 
    </body_properties> 
</person> 

這些例子是爲了說明我的要求簡化。真正的XML文件比很多元素要大得多。

但是,所有的XML輸入文件有沒有孩子的結構:

<person> 
    ... 
</person> 

或與孩子的

<person> 
    ... 

    <person> 
     ... 
    </person> 

    <person> 
     ... 
    </person> 

    <person> 
     ... 
    </person> 
</person> 

結構你有在XSL版本1.0中的XSLT解決方案的任何想法? 請不要發佈改變輸入文件格式的建議。這對我來說是不可能的。

+0

你用XSL嘗試過什麼?你能向我們展示你正在使用的XSL,以及它爲什麼不按你想要的方式工作? –

+0

「我正在尋找過濾給定xml數據文件的一些重要元素的xsl代碼」 - 也許您應該瞭解一些關於XSLT的內容,而不是試圖複製您不瞭解的代碼。如果您嘗試編碼解決方案併發布相關代碼區域,而不是要求某人爲您編碼,您將獲得更多幫助。 – PhillyNJ

回答

0

我問了一位同事尋求幫助,並得到了支持。 以下代碼適用於我。 可能是匹配/人物/人物和/人物的模板可以在沒有「不要重複自己」的情況下實現?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" media-type="xml" /> 

    <xsl:template match="/person/person"> 
     <xsl:copy> 
      <xsl:copy-of select="name"/> 
      <xsl:copy-of select="age"/> 

      <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/person"> 
     <xsl:copy> 
      <xsl:copy-of select="name"/> 
      <xsl:copy-of select="age"/> 

      <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="body_properties"> 
     <xsl:copy> 
      <xsl:copy-of select="eye_color"/> 
     </xsl:copy> 
    </xsl:template> 


    <!-- catch all unhandled elements --> 
    <xsl:template match="@*|node()" /> 

</xsl:stylesheet>