XSLT - 从for-each循环中的两个对象获取数据

时间:2022-02-04 14:27:36

I have a problem with xsl transformation. This is fragment of my code. input.xml

我有xsl转换的问题。这是我的代码片段。 input.xml中

<models>
    <model>
        <contact>
            <city>Tokyo</city>
            <telephone>555-888-999</telephone>
        </contact>
        <person>
            <name>Anna</name>
            <surname>Smith</surname>
            <age>33</age>
        </person>
        <person>
            <name>Melissa</name>
            <surname>MacBeth</surname>
            <age>26</age>
        </person>
    </model>
    <model>
        <contact>
            <city>New York</city>
            <telephone>987-254-845</telephone>
        </contact>
        <person>
            <name>Michael</name>
            <surname>Affronti</surname>
            <age>49</age>
        </person>
        <person>
            <name>Arthur</name>
            <surname>Bertrand</surname>
            <age>38</age>
        </person>
        <person>
            <name>Simon</name>
            <surname>Morris</surname>
            <age>22</age>
        </person>
    </model>
</models>

I need apply template for <contact> into for-each loop. This is required. xsl_template.xsl

我需要将 的模板应用到for-each循环中。这是必需的。 xsl_template.xsl

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

        <xsl:for-each select="/models/model">
            <xsl:apply-templates select="." />
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="contact">
        <phoneNo>
            <xsl:value-of select="city" />
        </phoneNo>
    </xsl:template>

    <xsl:template match="model">
        <xsl:for-each select="person">
            <responsible>
                <xsl:apply-templates select="contact" />
                <xsl:apply-templates select="." />
            </responsible>

        </xsl:for-each>
    </xsl:template>

    <xsl:template match="person">
        <person>
            <xsl:value-of select="name" />
            <xsl:text>, </xsl:text>
            <xsl:value-of select="surname" />
        </person>
    </xsl:template>
</xsl:stylesheet>

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<responsible>
    <person>Anna, Smith</person>
</responsible>
<responsible>
    <person>Melissa, MacBeth</person>
</responsible>
<responsible>
    <person>Michael, Affronti</person>
</responsible>
<responsible>
    <person>Arthur, Bertrand</person>
</responsible>
<responsible>
    <person>Simon, Morris</person>
</responsible>

Template for <contact> is missing. I tried also use <xsl:variable>, but it doesnt work. How can I get it?

缺少 的模板。我也试过使用 ,但它不起作用。我怎么才能得到它?

2 个解决方案

#1


0  

If you need to show contact for person (same for all persons inside model), then this:

如果您需要为人员显示联系人(模型中的所有人员都一样),那么:

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="preceding-sibling::contact" />
            <xsl:apply-templates select="." />
        </responsible>

    </xsl:for-each>
</xsl:template>

#2


0  

you need to adjust two things,

你需要调整两件事,

<xsl:template match="contact">
    <phoneNo>
        <xsl:value-of select="city" />
    </phoneNo>
</xsl:template>

s/b

<xsl:template match="contact">
    <phoneNo>
        <xsl:value-of select="telephone" />
    </phoneNo>
</xsl:template>

and

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="contact" />
            <xsl:apply-templates select="." />
        </responsible>
    </xsl:for-each>
</xsl:template>

s/b

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="../contact" />
            <xsl:apply-templates select="." />
        </responsible>
    </xsl:for-each>
</xsl:template>

under the xsl:for-each loop, you are under the context node person, so you must use the dot notation (..) to refer to the parent node.

在xsl:for-each循环下,您位于上下文节点person下,因此必须使用点表示法(..)来引用父节点。

#1


0  

If you need to show contact for person (same for all persons inside model), then this:

如果您需要为人员显示联系人(模型中的所有人员都一样),那么:

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="preceding-sibling::contact" />
            <xsl:apply-templates select="." />
        </responsible>

    </xsl:for-each>
</xsl:template>

#2


0  

you need to adjust two things,

你需要调整两件事,

<xsl:template match="contact">
    <phoneNo>
        <xsl:value-of select="city" />
    </phoneNo>
</xsl:template>

s/b

<xsl:template match="contact">
    <phoneNo>
        <xsl:value-of select="telephone" />
    </phoneNo>
</xsl:template>

and

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="contact" />
            <xsl:apply-templates select="." />
        </responsible>
    </xsl:for-each>
</xsl:template>

s/b

<xsl:template match="model">
    <xsl:for-each select="person">
        <responsible>
            <xsl:apply-templates select="../contact" />
            <xsl:apply-templates select="." />
        </responsible>
    </xsl:for-each>
</xsl:template>

under the xsl:for-each loop, you are under the context node person, so you must use the dot notation (..) to refer to the parent node.

在xsl:for-each循环下,您位于上下文节点person下,因此必须使用点表示法(..)来引用父节点。