2017-03-17 119 views
1

我要选择从XML的语言“和“食物”,使用XSLT,有这样的内容:选择两个属性在XSLT

<item id="1"> 
    <language>Spanish</language> 
    <food>Paella</food> 
    <score>3.5</score> 
    </item> 
    <item id="2"> 
    <language>Italian</language> 
    <food>Spagetthi</food> 
    <score>3.5</score> 
    </item> 

我haved试过以下,但它似乎没有工作:

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

    <xsl:template match="language|food"> 
    <xsl:apply-templates/> 
    <xsl:value-of select="language, ';')"/> 
    <xsl:value-of select="food, ';')"/> 
    </xsl:template> 

</xsl:stylesheet> 

我要找的输出是这样的: 西班牙语;海鲜饭,意大利; Spagetthi;

+0

我在您的输入中看不到“意大利语” - 请参阅:[mcve] –

+0

为什么不匹配'item'? – Filburt

+0

@ michael.hor257k我很抱歉,那只是一个例子,我同意它不清楚。我的意思是在我的第一个代码引用中,可能有几个项目包含不同种类的语言和食物。我会编辑我的帖子来澄清。 –

回答

2

@ michael.hor257k已经非常慷慨地提供有工作的代码,但他没有给你的,为什么你的企图被打破任何迹象,所以我担心它可能不要让你更加了解这些概念。让我们看看你的尝试:

<xsl:template match="language|food"> 
    <xsl:apply-templates/> 
    <xsl:value-of select="language, ';')"/> 
    <xsl:value-of select="food, ';')"/> 
    </xsl:template> 

有几个原因,这是永远不能工作。

首先,您需要修复xsl:value-of说明中缺失的圆括号。如果你要输出的语言元素有一个分号的价值,也有这样做的各种方式:

<xsl:value-of select="concat(language, ';')"/> 

<xsl:value-of select="language"/> 
<xsl:text>;</xsl:text> 

或XSLT 2.0(或更高版本)

<xsl:value-of select="language, ';'"/> 

二点:一表达式select="language"select="child::language"的简称 - 它选择当前(或“上下文”)节点的子元素的语言元素。在xsl:template中,上下文节点是匹配模式匹配的节点。你的匹配模式是match="language|food"。这些都没有一个称为语言或食物的子元素,所以你的xsl:value-指令将不会选择任何东西。

第三点:您的模板规则正在处理匹配元素的子元素两次。首先它使用xsl:apply-templates来处理使用模式匹配的孩子,然后使用xsl:value-of明确按名称处理它们。两种技术都可以正常工作。一起使用通常会给你重复的输出。

+0

非常感谢你!这真的帮助我了解我在做什么。 –

2

假设你的输入实际上是这样的:

XML

<world> 
    <item id="1"> 
    <language>Spanish</language> 
    <food>Paella</food> 
    <score>3.5</score> 
    </item> 
<item id="2"> 
    <language>Italian</language> 
    <food>Spagetthi</food> 
    <score>3.5</score> 
    </item> 
</world> 

你可以使用:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/world"> 
    <xsl:for-each select="item"> 
     <xsl:value-of select="language"/> 
     <xsl:text>;</xsl:text> 
     <xsl:value-of select="food"/> 
     <xsl:text>;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

,或者,如果你喜欢:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="item"> 
    <xsl:value-of select="language"/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="food"/> 
    <xsl:text>;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

获得:

Spanish;Paella;Italian;Spagetthi; 
+0

谢谢你,这完美地工作,很抱歉没有尽快回复你。 –