XSLT:常规标签与特定标签

时间:2018-10-01 20:08:05

标签: xml xslt xslt-2.0

我正在尝试编写XML-> CSV转换,并且不确定如何编写适用于具有通用名称语法的所有元素的模板,包括具有单独的特定模板的模板。这是我的代码:

<xsl:template match="dc:subject">
    <xsl:value-of select="replace(., '&#13;\n', '; ')"/> 
</xsl:template> 

<xsl:template match="dc:*">
   <xsl:value-of select="concat($quote, normalize-space(), $quote)" />
    <xsl:if test="following-sibling::*">
        <xsl:value-of select="$delim" />
    </xsl:if>
</xsl:template>

要转换的XML:

<dc:title>Title</dc:title>
<dc:subject>Dogs&#13;
Cats&#13;
Rabbits</dc:subject>
<dc:description>An adorable gathering of animals</dc:description>
<dc:date>2018 Oct 1</dc:date>

输出到:

"Title","Dogs; Cats; Rabbits;","An adorable gathering of animals","2018 Oct 1"

我尝试将其按几个不同的顺序排列,也将<xsl:apply-templates match="dc:subject">放在后者上,将<xsl:apply-templates match="dc:*">放在前面上,但是仍然没有将主题内容放在引号中/使用定界符。我知道我可以通过将其添加到dc:subject模板中来对此加以混淆,但是我宁愿做对了,而且我敢肯定这很简单!

谢谢。

1 个答案:

答案 0 :(得分:0)

使用constructor的一种方法是

this.sharedMessage.shareMessage$.subscribe((data) => {
    this.message = data; 
    this.prevQuestionId = this.message[0]; 
    this.currentQuestionId = this.message[1]; 
    this.nextQuestionId = this.message[2]; 
    this.percentageCompleted = this.message[3]; 
    console.log("I am message from questionnaire home component>>>>>" + this.message);
})

如您所见,我还必须显式提高输出引号的模板的优先级,因为只有这样才能首先使用它。显然,xsl:next-match的使用要求默认文本仅是 <xsl:template match="dc:subject"> <xsl:value-of select="replace(., '&#13;\n', '; ')"/> </xsl:template> <xsl:template match="dc:*" priority="2"> <xsl:value-of select="$quote"/><xsl:next-match/><xsl:value-of select="$quote"/> <xsl:if test="following-sibling::*"> <xsl:value-of select="$delim" /> </xsl:if> </xsl:template> 而不是xsl:next-match的任何内容的副本,但通常的样式表是内置规则,因此无论如何您还没有覆盖上面的其他方法。

在线示例位于https://xsltfiddle.liberty-development.net/6qVRKwQ/1

仅当您使用变量或链式样式表时,才可能发出“我想要做的就是将一个模板应用于另一个模板的输出”的请求。

我不知道您是否可以确定您的dc:*元素包含单个文本节点(而不是用注释或诸如dc:subject之类的处理指令分隔的数据),但是如果您确定存在只是一个文本节点,然后在元素上进行匹配以输出引号,例如

dc:*

也是可能的,不需要设置任何匹配优先级:https://xsltfiddle.liberty-development.net/6qVRKwQ/2

两个示例均未考虑您似乎也希望根据样本进行的<dc:foo>fo<!-- comment -->o</dc:foo>,我认为您可以添加 <xsl:template match="dc:subject/text()"> <xsl:value-of select="replace(., '&#13;\n', '; ')"/> </xsl:template> <xsl:template match="dc:*"> <xsl:value-of select="$quote"/><xsl:apply-templates/><xsl:value-of select="$quote"/> <xsl:if test="following-sibling::*"> <xsl:value-of select="$delim" /> </xsl:if> </xsl:template> 来处理,但也需要使用{如果normalize-space()文本也需要空格标准化,则用{1}}代替<xsl:template match="dc:*/text()"><xsl:value-of select="normalize-space()"/>