如何使用XSLT将format1中的xml转换为format2中提到的字符串?
格式1
<children>
<child data="test1">
<content><name>test1</name>
<child>
<content><name>test1child</name>
</child>
</child>
</children>
格式2
"<root>"
+"<item id='test1'>"
+"<content><name>test1</name></content>"
+"<item parent_id='test1'>"
+"<content><name>test1child</name>"
+"</content>"
+"</item>"
+</item>
+"<root>"
所以孩子应该用root替换,孩子应该用item替换,孩子的孩子应该替换为parent id *的* item parent_id。是否可以使用xslt?
答案 0 :(得分:2)
假设XSLT 2.0,这里有一些关于如何处理它的建议,假设你真的想要一些带引号和加号的字符串输出(以获取Javascript或类似的代码来构造XML作为字符串?):
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="*">
<xsl:param name="name" select="name()"/>
<xsl:text><</xsl:text>
<xsl:value-of select="$name"/>
<xsl:apply-templates select="@*"/>
<xsl:text>></xsl:text>
<xsl:apply-templates/>
<xsl:text></</xsl:text>
<xsl:value-of select="$name"/>
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="@*">
<xsl:param name="name" select="name()"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$name"/>
<xsl:text>='</xsl:text>
<xsl:value-of select="."/>
<xsl:text>'</xsl:text>
</xsl:template>
<xsl:template match="text()[matches(., '^\s+$')]">
<xsl:text>"
+"</xsl:text>
</xsl:template>
<xsl:template match="/children">
<xsl:text>"</xsl:text>
<xsl:next-match>
<xsl:with-param name="name" select="'root'"/>
</xsl:next-match>
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="child">
<xsl:next-match>
<xsl:with-param name="name" select="'item'"/>
</xsl:next-match>
</xsl:template>
<xsl:template match="child//child">
<xsl:variable name="copy" as="element()">
<xsl:copy>
<xsl:attribute name="parent_id" select="ancestor::child[1]/@data"/>
<xsl:copy-of select="@* , node()"/>
</xsl:copy>
</xsl:variable>
<xsl:apply-templates select="$copy"/>
</xsl:template>
</xsl:stylesheet>
转换输入
<children>
<child data="test1">
<content><name>test1</name></content>
<child>
<content><name>test1child</name></content>
</child>
</child>
</children>
进入结果
"<root>"
+"<item data='test1'>"
+"<content><name>test1</name></content>"
+"<item parent_id='test1'>"
+"<content><name>test1child</name></content>"
+"</item>"
+"</item>"
+"</root>"
到目前为止,代码有许多缺点,因为它不会使用正确的转义属性值构造格式良好的XML,也不关心输出命名空间声明。但是,您可以调整更复杂的解决方案,例如http://lenzconsulting.com/xml-to-string/。