理解xslt使用属性处理元素

时间:2009-08-18 20:28:19

标签: xml xslt

我在理解xslt时遇到了问题。在我的源文档中,我必须从<p>标记中找到内部文本,其class属性等于"deck"

在我的源代码xml中:

<body>
   <p class="deck">Text here</p>
... ... cut ... ... ... 

在我的xsl文件中

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:TimeInc="http://www.timeinc.com/namespaces/PAMTimeInc/1.0/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:prism="http://prismstandard.org/namespaces/basic/2.1/"
    xmlns:pam="http://prismstandard.org/namespaces/pam/2.1/"
    xmlns:pim="http://prismstandard.org/namespaces/pim/2.1/"
    xmlns:prl="http://prismstandard.org/namespaces/prl/2.1/">

    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
    <Description>
     <xsl:choose>
       <xsl:when test="//p@deck != ''">
        <xsl:value-of select="//p@deck"/>
       </xsl:when>
       <xsl:otherwise>
        <xsl:text disable-output-escaping="yes"/>
       </xsl:otherwise>
     </xsl:choose>
    </Description>
... ... cut ... ... ... 

这显然是不正确的,因为我不知道我在做什么。有没有关于如何做到这一点或更多地了解它的例子。

3 个答案:

答案 0 :(得分:2)

您可以根据属性值表示元素的条件匹配,例如

element[@attribute = 'hello']

针对您的具体情况:

<p class="deck">Text here</p>

尝试:

//p[@class = 'deck']/text()

这是一个XPath表达式,可以理解为返回所有p元素的文本内容序列,其属性类的值为“deck”。

XSLT使用XPath来导航XML文档,因此可能值得在XPath和XSLT上阅读。

答案 1 :(得分:2)

我没有看到任何地方作为模板的基础。不过,我认为这是一个剪切和粘贴问题。

无论如何,找到class属性设置为deck的所有p元素的xpath是: // P [@类= '甲板']

您可以使用以下内容迭代它们:

<xsl:for-each select="//p[@class='deck'">
</xsl:for-each>

答案 2 :(得分:2)

嗯......也许是这样的事情:

<Description>
    <xsl:choose>
        <xsl:when test="//p[@class='deck']">
            <xsl:value-of select="//p[@class='deck']" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:test> </xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</Description>