1

我正在尝试使用 xsl 2.0 根据语言名称创建不同的 xml 文件。在我的输入 xml 中,这里只有 2 种语言,“en”和“es”。

  1. 所有基于“en”的人都将转到 en.xml 和
  2. 所有基于“es”的人都将转到 es.xml 和
  3. 所有同时拥有“en”和“es”的人都必须同时访问 en.xml 和 es.xml。

我的输入 XML: 源 xml 是关于人员列表、他们的地址和语言的

<persons>
    <person name="Alice">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "en">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Bob">
        <Addresses>
            <Address type ="personal">
                <language name = "es">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
</persons>

输出文件 en.xml 将具有:

所有包含语言属性值 = "en" 的人都应该转到 en.xml 文件。在这种情况下,Alice 和 Stacy 都需要访问 en.xml

    <person name="Alice">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "en">
                </language>
            </Address>
        </Addresses>
    </person>
        <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>

输出文件 es.xml 将具有:

所有包含语言属性值 = "es" 的人都应该转到 en.xml 文件。在这种情况下,Bob 和 Stacy 都需要访问 es.xml

    <person name="Bob">
        <Addresses>
            <Address type ="personal">
                <language name = "es">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>
    <person name="Stacy">
        <Addresses>
            <Address type ="personal">
                <language name = "en">
                </language>
            </Address>
            <Address type ="business">
                <language name = "es">
                </language>
            </Address>
        </Addresses>
    </person>

到目前为止我的 XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="2.0">

<xsl:output method="xml" indent="yes" name="xml"/>

<xsl:template match="/">
    <xsl:for-each select="//persons">
       <xsl:variable name="filename"
             select="concat('allpersons/',//persons/person/Addresses/Address/language/@name,'.xml')" />
       <xsl:value-of select="$filename" />  <!-- Creating  -->
       <xsl:result-document href="{$filename}" format="xml">
             <xsl:value-of select="."/>
       </xsl:result-document>
     </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

解决方案不应包含“en”、“es”等属性的静态匹配。因为有很多语言。任何帮助都非常感谢?

参考资料: http ://www.ibm.com/developerworks/xml/library/x-tipmultxsl/index.html

4

1 回答 1

1

这是一个 XSLT 2.0 示例:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="persons">
  <xsl:for-each-group select="person" group-by="Addresses/Address/language/@name">
    <xsl:result-document href="{current-grouping-key()}.xml">
      <xsl:apply-templates select="current-group()"/>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>

<xsl:template match="person/Addresses">
  <xsl:if test="Address/language/@name = current-grouping-key()">
    <xsl:next-match/>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

我不确定您是否真的想在没有根目录的情况下创建这些结果文件,但如果您想要根目录,请将persons模板更改为

<xsl:template match="persons">
  <xsl:for-each-group select="person" group-by="Addresses/Address/language/@name">
    <xsl:result-document href="{current-grouping-key()}.xml">
      <persons>
        <xsl:apply-templates select="current-group()"/>
      </persons>
    </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>
于 2012-09-14T17:36:50.683 回答