我正在尝试编写XML-> CSV转换,并且不确定如何编写适用于具有通用名称语法的所有元素的模板,包括具有单独的特定模板的模板。这是我的代码:
<xsl:template match="dc:subject">
<xsl:value-of select="replace(., ' \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
Cats
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
模板中来对此加以混淆,但是我宁愿做对了,而且我敢肯定这很简单!
谢谢。
答案 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(., ' \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(., ' \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()"/>
。