XSLT:如何单独匹配每个后代?
XSLT: How do I match every descendant individually?
我正在尝试压平以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://pretend.namespace">
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
</root>
合并成一条row-per记录,丢弃记录中的复杂结构。
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
使用此 XSLT
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://pretend.namespace">
<xsl:strip-space elements="*"/> <!-- remove unwanted whitespace? -->
<!-- Match every p:record -->
<xsl:template match="p:record">
<xsl:apply-templates/> <!-- now we're inside a <record> do what you can with the contents then give a line return -->
<xsl:text>
</xsl:text><!-- this is a line return -->
</xsl:template>
<xsl:template match="p:record//*">
<xsl:value-of select="."></xsl:value-of><xsl:text>,</xsl:text>
</xsl:template>
<xsl:template match="text()"/> <!-- WORKS: prevents "default output" to aid debugging -->
</xsl:stylesheet>
但尽管尝试了几个小时,我还是无法访问每个后代和 comma-separate 他们,我明白了:
1,2,345,
1,2,345,
1,2,345,
我需要做什么才能让它对所有孙子及以下的孩子进行单独治疗? (每行最后一个逗号不是问题)
谢谢!
编辑:这个问题之后的讨论表明 Herong Yang 博士的 XML Notepad++ 工具 似乎 仅支持 XSLT 1.0
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://pretend.namespace">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="p:record">
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*[not(*)]">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
为什么不干脆
<xsl:strip-space elements="*"/>
<xsl:template match="record">
<xsl:value-of select="descendant::text()/data()" separator=","/>
<xsl:text>
</xsl:text>
</xsl:template>
(需要使用 data()
的显式原子化,否则相邻文本节点将在没有分隔符的情况下连接)。
我正在尝试压平以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://pretend.namespace">
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
<record>
<first>1</first>
<second>2</second>
<tricky>
<taxing>3</taxing>
<mayhem>
<ohno>4</ohno>
<boom>5</boom>
</mayhem>
</tricky>
</record>
</root>
合并成一条row-per记录,丢弃记录中的复杂结构。
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5
使用此 XSLT
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://pretend.namespace">
<xsl:strip-space elements="*"/> <!-- remove unwanted whitespace? -->
<!-- Match every p:record -->
<xsl:template match="p:record">
<xsl:apply-templates/> <!-- now we're inside a <record> do what you can with the contents then give a line return -->
<xsl:text>
</xsl:text><!-- this is a line return -->
</xsl:template>
<xsl:template match="p:record//*">
<xsl:value-of select="."></xsl:value-of><xsl:text>,</xsl:text>
</xsl:template>
<xsl:template match="text()"/> <!-- WORKS: prevents "default output" to aid debugging -->
</xsl:stylesheet>
但尽管尝试了几个小时,我还是无法访问每个后代和 comma-separate 他们,我明白了:
1,2,345,
1,2,345,
1,2,345,
我需要做什么才能让它对所有孙子及以下的孩子进行单独治疗? (每行最后一个逗号不是问题)
谢谢!
编辑:这个问题之后的讨论表明 Herong Yang 博士的 XML Notepad++ 工具 似乎 仅支持 XSLT 1.0
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://pretend.namespace">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="p:record">
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*[not(*)]">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
为什么不干脆
<xsl:strip-space elements="*"/>
<xsl:template match="record">
<xsl:value-of select="descendant::text()/data()" separator=","/>
<xsl:text>
</xsl:text>
</xsl:template>
(需要使用 data()
的显式原子化,否则相邻文本节点将在没有分隔符的情况下连接)。