-1

我正在寻找过滤给定 xml 数据文件的一些重要元素的 xsl 代码。以下示例显示了有关一位父亲和他的两个孩子的全部数据。

这个文件是我的输入文件:

<?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 解决方案有任何想法吗?请不要发布更改输入文件格式的建议。这对我来说是不可能的。

4

1 回答 1

0

我向一位同事寻求帮助并得到了支持。以下代码适用于我。是否可以在没有“不要重复自己”的情况下实现匹配 /person/person 和 /person 的模板?

<?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>
于 2013-10-11T11:49:20.513 回答